前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >016:Scrapy使用中必须得会的问题

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

作者头像
李玺
发布2021-11-22 18:45:07
1.5K0
发布2021-11-22 18:45:07
举报
文章被收录于专栏:爬虫逆向案例

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/04/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Scrapy 的优缺点?
  • scrapy去重原理
  • scrapy是深度优先还是广度优先的,要怎么自定义:
  • 全链接爬取时如何记录已经访问过的url:
  • 已知服务器信息时,如何过滤存在别名的url地址:
  • 如何避免在动态虚拟web空间的循环和重复?
  • scrapy爬取深度设置(url的深度)
  • scrapy随机更换代理ip策略
  • scrapy框架利用start_requests方法改写post请求
  • scrapy如何实现大文件的下载?
  • 将所有item 转存(dump)到 JSON/CSV/XML 文件的最简单的方法?
  • 你遇到验证码是如何处理:
  • 如何处理网站传参加密的情况:
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档