进阶-爬虫

Z1h是一门很适合进行爬虫的语言, 自带的函数支持对各种类型的网站进行爬虫

HTTP

爬虫的基础是http请求, 对于如何发起http请求, Z1h提供了多种方式

快速请求

url = '任意链接'
getBody = url.get() // 发起get请求, 可传入header参数
postBody = url.post({ // 发起post请求, 可以传入body、header参数
	k1: v1
})
url.download("本地文件")

没错, 字符串string类型就自带了"get"、"post"、"download"等函数(可见字符串文档的内置函数)

复杂请求

提供了$http()$http.request$http.download等函数可以构建较为复杂的http请求(文档未就绪)

原生函数

例如可以使用Go的原生函数构建请求

req = assert(net_http.NewRequest("POST", "http://baidu.com", reader("s=test")))
res = assert(new(net_http.Client).Do(req))
defer res.Body.Close()
print(readall(res.Body).s)

代理

代理请求

不少http请求相关的方法都可以在headers中设置_proxy_来使用简单的代理

代理抓包

可以使用$proxy开启代理服务, 进而通过篡改请求数据或响应数据的方式辅助爬虫, 详见HTTP代理

JSON

解析

`{"name": "zwr"}`.m // 解析成map类型
`[11,22,33]`.a // 解析成array类型

字符串string类型就自带了"m"、"a"、"json"等内置对象可以直接解析值(可见字符串文档的内置对象)

寻找json

如果在爬虫的过程中, 你下载了一个网页, 网页内包含了大量的json, 其中就包含着你感兴趣的内容, 可以使用$json.find方法进行查找

示例

body = `xxx{"name": "zwr"}yyy{"age": 25}zzz`
print($json.find(body)) // 输出两个json
print($json.find(body).map(e=>range(e)[0][0])) // 输出这些json的第一个key

在文档完成之前, 不妨使用Object.keys($json)的方式来看看$json都有哪些好用的函数, 并且可以动手试用

并行任务

可以前往并发文档学习如何使用并发的方式来提高你的爬虫效率, 节约时间, 下方是简单的例子:

urls = range(1,16).map(e=>`http://xxx?page=${e}`) // mock一些网址
results = urls.asyncMap(e=>e.download(path.Base(e)), 16) // 16协程并发下载

示例

爬取中文标签

集http请求、正则提炼标签、计数、排序、过滤等功能为一行代码

range(`https://www.so.com/s?q=${'林俊杰'.urlEncode()}`.get().s.find('[\u4e00-\u9fa5]{2,}').count()).sort((l,r)=>l[1]>r[1]).filterMap(e=>{e[0] if e[1]>1 else false})