爬虫工作量由小到大的思维转变---<第十七章 Scrapy给项目套上代理ip.middleware---非demo(二)>

前言:

上一章节已经说过了免费代理ip提取的问题;就目前的时间来看,其实除了秀技之外,没别的了;还是需要花费去整有效ip;

市面上的ip,大体分:个数/有效时间

且我发现最近反馈的说:"很多那些培训班的老师对于 `代理ip配装scrapy`时,都是含糊带过---让很多人以为这关键的一环并不重要;" 

其实,前面的爬取/分析/存储 网上一搜一大把!

真正能让你的scrapy跑起来,根据你自己的项目/服务配置+ip属性,顺溜丝滑地跑是很值得玩味的!!! 

且能不能让你的项目,日跑抓单100W+ /500W+...,这个配置ip才是硬货,差距就在这里拉开 

所以,我现在来讲一些,"培训班故意不给你们讲的东西"-----'个数'ip的scrapy的装载问题:

正文:

装配ip代理为什么重要?

他直接涉及到你和代理的ip的利益关系,拿快了,你花钱!拿慢了,你项目落下了; 怎么把每一份花钱买来的ip,给他榨干?!又让自己的项目,跑得丝滑?

首先我抛出几个问题,丢个大家思考:
  • 1.scrapy是异步爬取的,也就是几乎同一时间,几十上百个url同时发起请求,你从网络api提出的ip数量够不够整一轮的?
  • 2.当开始运行scrapy,你是准备怎么存储你从api获取的ip呢? 每请求一次,就发一起请求?还是把IP存起来?
  • 3.当一个ip请求因为太频繁被封了,你肯定是想的换一个ip;那么,怎么换? 换完之后,这个请求你怎么处理?
  • 4.论个数的ip,都值得金贵! 不给他用到油尽灯枯,都觉得实在浪费钱;那么怎么把它用尽?
  • 5.何时去向api请求新的ip,要知道,每请求一次,就是钱!

...

我要解决这些问题:

  1. 在 process_request 方法中,如果代理IP池为空或数量小于2,会调用 refresh_proxy_ips 方法刷新代理IP列表。
  2. 如果代理IP池不为空,则从中选择下一个代理IP,并将其添加到请求的元数据中。
  3. 在 process_response 方法中,如果判断响应为无效响应,则会移除当前代理IP,并增加请求的重试次数。
  4. 如果重试次数小于3,会创建一个新的请求,并将其设置为不被去重过滤的请求,然后返回该新请求,实现了使用新的代理IP进行重试。
  5. 如果重试次数达到或超过3,将当前URL写入错误记录文件,并抛出异常。
  6. 如果判断响应为有效响应,则直接返回响应。
  7. 在 process_exception 方法中,发生异常时,会移除发生异常的代理IP,并调用 handle_failed_request 处理请求失败的情况。
  8. refresh_proxy_ips 方法用于发送请求获取代理IP,并将其存储在 ip_cache 列表中。
  9. get_next_proxy_ip 方法按随机选择一个代理IP,并返回给调用者。
  10. handle_failed_request 方法会统计请求失败的次数,并当请求失败次数达到或超过3次时,将该URL写入错误记录文件,并抛出异常。
  11. ...还有一些彩蛋...

相关代码,已经打包好了!  提取api的url你们自己填,改成自己需要的格式,剩余的,例如超过次数的.txt等,大家慢慢盘一下,你后续要不要补数据;

代码图例:

运行效果:

爬虫工作量由小到大的思维转变---<第十七章 Scrapy给项目套上代理ip.middleware---非demo(二)>_第1张图片爬虫工作量由小到大的思维转变---<第十七章 Scrapy给项目套上代理ip.middleware---非demo(二)>_第2张图片爬虫工作量由小到大的思维转变---<第十七章 Scrapy给项目套上代理ip.middleware---非demo(二)>_第3张图片

最后:

装完了代理ip可别马上就把并发开得高高的!! 一定要调整你的

装完了代理ip可别马上就把并发开得高高的!! 一定要调整你的

装完了代理ip可别马上就把并发开得高高的!! 一定要调整你的

    custom_settings = {
        'DOWNLOAD_DELAY': 0.3,#控制两个连续请求之间的延迟时间  设置为 0.1 表示每次请求之间的等待时间为 0.1 秒

        'CONCURRENT_REQUESTS_PER_DOMAIN': 3,  #每个域名的并发请求数,设置为 3 表示同时只能有一个请求发送到同一个域名。
        'CONCURRENT_REQUESTS_PER_IP': 5, #每个IP的并发请求数  , 控制在同一时间向同一个IP地址发送的并发请求数量
    }

这里真的很关键! 他就是你的项目和你的ip以及存储处理等配合的地方...有一个小心得:

CONCURRENT_REQUESTS_PER_Ip 的值:
  • 你每次从api获取X个ip,你的最大值不能高于这个X,最好是卡在(70%*X)这个范围内;
DOWNLOAD_DELAY:
  •  从1到2秒,往低了慢慢调;一次调一半~例如,起始2秒,你觉得太慢了,你就调成1;如果觉得1太过了,你就再调到1.5...一直到你满意!
CONCURRENT_REQUESTS_PER_DOMAIN:
  •   这个值,从起始3,等另外两个值调好了,最后调他!往上调,慢慢加!

调到什么时候为止呢?

---在我资源里,给你们写了txt!

总结:文章资源内代码不是做demo,比较实用,自己慢慢调的一个项目(我定义的是ip每次拿5个)! 相关文件资源里,自己下载吧...

你可能感兴趣的:(15天玩转高级python,爬虫,scrapy,tcp/ip)