进阶-爬虫
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})