时间:2021-07-01 10:21:17 帮助过:31人阅读
https://github.com/Chion82/hello-old-driver
为了兼容多个站点,我的爬虫脚本并没有针对某个特定的网站进行抓取逻辑定制,而是采取递归遍历网站全部页面+正则匹配磁力链hash的方式抓取整站的磁力链资源。磁力链的hash协议大多数时候是BTIH,hash值为40位的hex字符串,匹配的正则如下:
[^0-9a-fA-F]([0-9a-fA-F]{40})[^0-9a-fA-F]
注意,为了保证hash串长度为40字节,在其前后应加上非hex的匹配,即 [^0-9a-fA-F]。
这样将可能导致一个问题,网站页面源码中可能还存在磁力链以外的SHA-1值,比如琉璃神社在每条用户评论后在一个标签属性内有40字节长的一段hash值,目前的解决方法是忽略HTML标签 <>内的属性内容:
if (ignore_html_label): #为了增强扩展性,这类fix逻辑应该可控 result_text = re.sub(r'<.*?>', '', result_text)
每个磁力链资源应当要有对应的标题以方便查找,这里以网页的标题作为资源标题,匹配正则如下:
(.+?)
经测试发现,每轮抓取结束后,抓取到的资源数量可能不一样,可能的原因是网站方对访问频次做了限制或者是本地网络质量问题,就算通过连接失败重试、服务器返回5XX后重试等方法也不能解决。于是决定:每次抓取不覆盖上次抓取的结果,而是保留上次的结果,并新增本次抓取到的、上次结果中没有的新磁力链资源。
其他的一些必需属性:
cookie = '' #每次请求需要带上的Cookie。由于琉璃神社目前不需要登录,暂为空串max_depth = 40 #递归最大深度,即从一个网页查找全部链接并依次往下递归访问,最大的深度为40viewed_urls = [] #访问过的URL,避免重复访问found_magnets = [] #查找出来的磁力链资源,避免重复抓取ignore_url_param = True #是否忽略URL中的参数,比如"index.html?xxx=11"将被替换为"index.html"ignore_html_label = True #是否忽略HTML标签内属性
需要定时执行抓取脚本以保证与原网站同步。写了一个shell脚本, sync.sh,作用如下: