《精通Python网络爬虫》第18章讲的是博客类爬虫项目实战,目标网站是和讯博客,这是一个很好的练手项目。
通过这个项目,收获不小:
- 初步接触Google浏览器强大的开发调试功能,包括对JS的调试,DOM断点调试,Newwork监视网络连接
- 爬虫时‘点击数’和‘评论数’这两个字段爬出的结果是0,由于对html语言不熟悉,通过分析,发现这两个字段是通过javascript获取并修改元素的值来实现的,修改之后把javascript代码也删除了,导致Google浏览器DOM断点调试(“break on”–>“subtree modification”)也不会中断,后来在Google浏览器Newwork中发现链接(http://click.tool.hexun.com/linkclick.aspx?blogid=11511332&articleids=115716166-115699791-115679739-115604201-115570728-115553671-115514688-115480573-115469853-115436422-115716166-115699791-115679739-115604201-115570728-115553671-115514688-115480573-115469853-115436422 )才看出端倪
- scrapy shell命令很强大,可以在一边开发一边测试css或xpath表达式提取结果是否跟预期一样,并且可以传入参数修改header,例如:
scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0" https://blog.csdn.net/zfs2008zfs
- 书中在提取‘点击数’和‘评论数’使用正则表达式匹配,我使用了字符串的split方法
- 应对反爬虫常用代码片段:
import urllib.request
import urllib.error
req = urllib.request.Request('爬虫目标的链接')
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0')
req.add_header('Referer','与爬虫目标相关')
try:
data = urllib.request.urlopen(req).read()
data = str(data).replace('"','')
#print(data)
results = data.split('$')[2:]
for result in results:
temp_list = result.replace('(','').replace(')','').replace(';','').replace("'",'').split(',')
id_result[temp_list[0]]=temp_list[1]
except urllib.error.URLError as e:
if hasattr(e,'code'):
print(js_url,e.code)
if hasattr(e,'reason'):
print(js_url,e.reason)
- 发爬虫的机制有多种,包括对User-Agent和Referer字段的检测,在使用scrapy shell命令时要注意返回结果是不是200。另外,scrapy不能执行JavaScript代码,所以很有可能scrapy中response与google浏览器看到的源代码不一致,要特别注意。
最后,附上本人写的代码:https://github.com/zhangjiuling/hexunpjt