(1)优点:scrapy 是异步的
采取可读性更强的 xpath 代替正则强大的统计和 log 系统,同时在不同的 url 上爬行支持 shell 方式,方便独立调试写 middleware,方便写一些统一的过滤器,通过管道的方式存入数据库
(2)缺点:基于 python 的爬虫框架,扩展性比较差
基于 twisted 框架,运行中的 exception 是不会干掉 reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉。
那简单介绍下 scrapy 的异步处理?
scrapy 框架的异步机制是基于 twisted 异步网络框架处理的,在 settings.py 文件里可以设置具体的并发量数值(默认是并发量 16)。
对于每一个url的请求,调度器都会根据请求得相关信息加密(request_fingerprint)得到一个指纹信息,并且将指纹信息和set()集合中的指纹信息进行比对,如果set()集合中已经存在这个数据,就不在将这个Request放入队列中。如果set()集合中没有存在这个加密后的数据,就将这个Request对象放入队列中,等待被调度。
这里两个条件控制:
首先是dont_filte如果是 False、是要筛选的。
然后request_seen()在默认内置的筛选方法中,就是 RFPDupeFilter()中的方法,检查 request 是否已经存在。只有要筛选且没有见过这个 request,才会去筛选 url。
scrapy-redis去重和scrapy默认的去重一致
区别在于:
去执行scrapy_redis中的 scheduler.py 中的enqueue_request()
scrapy使用的是后进先出队列,基本可以看成是深度优先。
如果需要设置广度优先(BFO),可以在settings中添加以下代码。另外当DEPTH_PRIORITY为正值时越靠广度优先,负值则越靠深度优先,默认值为0
settings中设置方法:
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = ‘scrapy.squeues.PickleFifoDiskQueue’
SCHEDULER_MEMORY_QUEUE = ‘scrapy.squeues.FifoMemoryQueue’
所以要规范化url:
规范化url、 广度优先爬行策略、 节流、 限制url的大小、
设置站点黑名单、 模式检测、 内容指纹、 人工监视、
详情可看博客:https://blog.csdn.net/weixin_43582101/article/details/89431997
通过在settings.py中设置DEPTH_LIMIT的值可以限制爬取深度,这个深度是与start_urls中定义url的相对值。也就是相对 url的深度。
scrapy随机切换用户代理User-Agent
自定义一个Downloader Middleware,可以做到每次请求时,拦截一下,给请求头自动随机更换User-Agent。我们使用fake-useragent这个开源库。
下载中间件中process_request方法里设置:request.meta‘proxy’ = proxy‘host’
然后在settings中进行配置Downloader Middleware
scrapy默认发起的是get请求。我们必须重写start_request方法。改变里面的url,
method改变为POST,callback为self.parse_post,构建parse_post方法。
当使用requests的get下载大文件/数据时,建议使用使用stream模式。
当把get函数的stream参数设置成False时,它会立即开始下载文件并放到内存中,如果文件过大,有可能导致内存不足。
当把get函数的stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载。需要注意一点:文件没有下载之前,它也需要保持连接。
iter_content:一块一块的遍历要下载的内容
iter_lines:一行一行的遍历要下载的内容
使用上面两个函数下载大文件可以防止占用过多的内存,因为每次只下载小部分数据。
dump 到 JSON 文件:
scrapy crawl myspider -o items.json
dump 到 CSV 文件:
scrapy crawl myspider -o items.csv
dump 到 XML 文件:
scrapy crawl myspider -o items.xml
1.登陆验证码处理:
图片验证码:先将验证码图片下载到本地,然后使用云打码识别;
滑动验证码:使用selenium模拟人工拖动,对比验证图片的像素差异,找到滑动的位置然后获取它的location和size,然后 top,bottom,left,right = location‘y’ ,location‘y’+size‘height’+ location‘x’ + size‘width’ ,然后截图,最后抠图填入这四个位置就行。
2.爬取速度过快出现的验证码处理
设置setting.py中的DOWNLOAD_DELAY,降低爬取速度;
用xpath获取验证码关键字,当出现验证码时,识别验证码后再继续运行。
加密的三种情况:
1、加密+访问次数限制+每个页面相关信息的条目需要点详情进行二次请求;
2、复杂的加密算法进行参数+时间戳+sig值,后台进行 参数+时间限制;
3、定时同步cookie+每个界面一个cookie。
破解方法:
1、使用selenium模拟点击获取详情页面;
2、获取其相应的api接口,GET接口URL,获取它的json表格内容;
3、反向分析网页JS加载内容;