016:Scrapy使用中必须得会的问题

举报
冬晨夕阳 发表于 2022/03/30 01:12:57 2022/03/30
【摘要】 Scrapy 的优缺点? (1)优点:scrapy 是异步的 采取可读性更强的 xpath 代替正则强大的统计和 log 系统,同时在不同的 url 上爬行支持 shell 方式,方便独立调试写 mid...

Scrapy 的优缺点?

(1)优点:scrapy 是异步的
采取可读性更强的 xpath 代替正则强大的统计和 log 系统,同时在不同的 url 上爬行支持 shell 方式,方便独立调试写 middleware,方便写一些统一的过滤器,通过管道的方式存入数据库
(2)缺点:基于 python 的爬虫框架,扩展性比较差
基于 twisted 框架,运行中的 exception 是不会干掉 reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉。

那简单介绍下 scrapy 的异步处理?
scrapy 框架的异步机制是基于 twisted 异步网络框架处理的,在 settings.py 文件里可以设置具体的并发量数值(默认是并发量 16)。

scrapy去重原理

对于每一个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是深度优先还是广度优先的,要怎么自定义:

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:
在这里插入图片描述

如何避免在动态虚拟web空间的循环和重复?

规范化url、 广度优先爬行策略、 节流、 限制url的大小、
设置站点黑名单、 模式检测、 内容指纹、 人工监视、

详情可看博客:https://blog.csdn.net/weixin_43582101/article/details/89431997

scrapy爬取深度设置(url的深度)

通过在settings.py中设置DEPTH_LIMIT的值可以限制爬取深度,这个深度是与start_urls中定义url的相对值。也就是相对 url的深度。

scrapy随机切换用户代理User-Agent
自定义一个Downloader Middleware,可以做到每次请求时,拦截一下,给请求头自动随机更换User-Agent。我们使用fake-useragent这个开源库。

scrapy随机更换代理ip策略

下载中间件中process_request方法里设置:request.meta[‘proxy’] = proxy[‘host’]
然后在settings中进行配置Downloader Middleware

scrapy框架利用start_requests方法改写post请求

scrapy默认发起的是get请求。我们必须重写start_request方法。改变里面的url,
method改变为POST,callback为self.parse_post,构建parse_post方法。

scrapy如何实现大文件的下载?

当使用requests的get下载大文件/数据时,建议使用使用stream模式。
当把get函数的stream参数设置成False时,它会立即开始下载文件并放到内存中,如果文件过大,有可能导致内存不足。
当把get函数的stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载。需要注意一点:文件没有下载之前,它也需要保持连接。
iter_content:一块一块的遍历要下载的内容
iter_lines:一行一行的遍历要下载的内容
使用上面两个函数下载大文件可以防止占用过多的内存,因为每次只下载小部分数据。

将所有item 转存(dump)到 JSON/CSV/XML 文件的最简单的方法?

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加载内容;

文章来源: blog.csdn.net,作者:考古学家lx,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_43582101/article/details/89494970

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。