Colly是Golang世界最知名的Web爬虫框架了,它的API清晰明了,高度可配置和可扩展,支持分布式抓取,还支持多种存储后端(如内存、Redis、MongoDB等)。这篇文章记录我使用colly在爬取b站评论时的整体过程 :)
!!!这并不是一篇教程,勉强说只是一个使用colly的小例子,只是记录了我写代码的过程而已,不会对具体的代码或方法进行具体说明,所以如果您还没有学习colly,建议您先去学一下,上手使用一下
思路:
(相关资料图)
获取b站某个视频评论数据,需要找到具体的url,数据会以json格式被url返回
拥有相对应的结构体,评论中的数据可以放在结构体当中
获取请求头
使用colly的OnResponse()方法进行对得到的json数据进行处理
输出评论
首先,网页可以分为静态网页和动态网页,对于静态网页,如下图bing搜索页面,可以直接在开发者工具中的网络项里很容易找到该页面的url,而该页面的所有数据都存放在该url当中。
因此只需要在元素项当中找到想要爬取的内容复制其selector选择器,这一步也很简单,然后在代码中使用OnHTML()函数进行操作,b站也有相关的视频对此讲解,因此不再累述。
而对于像哔哩哔哩这样的动态网页,我们无法使用OnHTML直接爬取整个页面的数据,因为所有数据并不会放在该页面地址栏上的url里,比如b站评论的数据会单独放在一个url里进行返回。
所以首先需要在开发者工具里找到属于评论数据的url,一般为json格式,在网络项中选中Fetch/XHR格式,若名称条数依旧很多,可以在筛选器中输入reply进行筛选
在预览中我们可以看到返回的评论数据
在标头中可以打开该url进行查看
这密密麻麻的数据真是闪我一脸,想要更好的查看返回的json数据可以在edge浏览器安装
JSON-handle插件
安装好后再次打开url,啊,清爽多了
发现该url只记录了前20个评论数据,可以推出还有其他的url,因为是GET请求,所以通过比较不同其它评论的url,可以通过更改param获取不同的20条评论,这件事若读者有兴趣可以去做一下,在此我不做深究
然后我们就需要把这些json数据转化为对应的结构体,这样url返回的数据就可以直接存储在我们定义的结构体里了,为了简便我们可以使用在线工具进行转换
这里提供一个网站 JSON转Golang Struct - 在线工具 - OKTools
/json2go
可以根据喜好选择结构体展开或嵌套的形式,我这边选择嵌套,看着更直观一点
复制后把代码放到IDE中,结构体竟然达到了快500行,并且有错误
查看后错误是命名重复导致的,先无视
首先注意到生成的结构体的变量名称是以驼峰名命名的,对应着json数据的蛇形命名
对json数据变量名称一一对比,确实只是多了3个Content结构体,删除即可,而对我们不需要的数据,也可以在结构体中进行删除
最终,我留下了以下结构体数据,如下图
现在我们的结构体有了,对应的url也同样找到了,我们还需要再网页上复制该网页的请求标头,
当然,我们可以使用在线工具自动生成请求标头的相关代码,
我分享一个我使用的:在线curl命令转代码 ()
/convert/curl-to-code
怎么使用呢? 如下图操作,复制为cURL(bash),不用全部复制哦
我们这个的url请求方式是GET,所以选择GET,把复制内容覆盖进去进行转换
输出结果是一个go原生的连接url的代码,我们只需要复制所有的()即可,
*如果同一个网站被相同浏览器频繁访问,很容易被网站识别为爬虫程序,所以一般通过使用多个User-Agent随机调用的方式,可以有效避免同一个请求头访问网站,网上也有很多的方式去随机生成user-agent,这边我找了一个生成随机数的方法
现在我们的代码应该是这个样子
然后我们在使用()函数对得到的json数据进行处理
现在我们就可以进行遍历输出了
嗯...评论太长了,我们换一个视频并按时间对评论进行排序
可以清除看到共20条,大功告成!!!
附上全部代码
Copyright © 2015-2022 每日房产网版权所有 备案号:浙ICP备2022016517号-15 联系邮箱:5 146 761 13 @qq.com