故障分析系列(01) —— scrapy爬虫速度突然变慢原因分析

2023-11-20

故障分析系列(01) —— scrapy爬虫速度突然变慢原因分析

1. 问题背景

  • 在所有环境都没变的情况下,scrapy爬虫每天能爬取的数据量从3月5号开始急剧减少,后面几天数据量也是越来越少。
    这里写图片描述

2. 环境

  • 系统:win7
  • python 3.6.1
  • scrapy 1.4.0
  • 网络:电信100Mb
  • 代理:阿布云(服务商是阿里云)
  • 爬取站点:amazon,amztracker

3. 排查步骤

3.1. 抓取scrapy爬虫的Log

# 文件 settings.py中
import datetime

LOG_LEVEL = 'DEBUG'		# log等级设置为debug模式
startDate = datetime.datetime.now().strftime('%Y%m%d')
LOG_FILE = f"redisClawerSlaver_1_log{startDate}.txt"	# 将log写入文件中

# 小技巧:因为debug模式下,一天下来,log会非常大,用Notepad++无法打开,可以使用UltraEdit来打开
  • 后来分析Log,搜索failed, 发现了大量的 timeout error,占到了错误的九成,而且这两个站点的链接都有:

  • 大量的Timeout会导致大量的重试,而且每个timeout,都要等待20s,才返回错误,所以极大的拉慢了爬虫的速度。
    这里写图片描述

  • 结论1:所以大胆猜测可能有几个原因:

  • 第一,本地网络变慢。

  • 第二,爬取的站点发生了变化,包括爬取的内容发生了变化。

  • 第三,阿布云代理故障。

  • 第四,爬虫错误。

  • **思考与完善:**其实在这一步,应该做好详细的error统计的,记录在数据库中,这个后期要完善起来。补充一下,形如此类:

# 文件 spider.py中
from scrapy.spidermiddlewares.httperror import HttpError
from twisted.internet.error import TimeoutError, TCPTimedOutError, DNSLookupError, ConnectionRefusedError

yield response.follow(
    url=re.sub(r'page=\d+',f'page={page}',url,count=1),
    meta={'dont_redirect':True,'key':response.meta['key']},
    callback=self.galance,
    errback=self.error    # 做好error记录
)

RETRY = 4    # settings中最大重试次数

def error(self, failure):
    if failure.check(HttpError):
        response = failure.value.response
        if response.meta['depth'] < RETRY:
            failure.request.dont_filter = True
            yield failure.request
        else:
            yield {
                'url': response.url, 'error': 'HttpError', 'depth': response.meta['depth'],
                'priority': response.request.priority, 'status': response.status,
                'callback': response.request.callback.__name__,
                'key': response.meta.get('key') or response.meta.get('item', {}).get('key', ''),
            }  # 日志用

    elif failure.check(TimeoutError, TCPTimedOutError, ConnectionRefusedError, DNSLookupError):
        request = failure.request
        yield {
            'url': request.url,
            'error': 'TimeoutError',
            'priority': request.priority,
            'callback': request.callback.__name__,
            'key': request.meta.get('key') or request.meta.get('item', {}).get('key', ''),
        }  # 日志用,只在最后一次超时后才执行

    else:
        request = failure.request
        yield {'url': request.url, 'error': 'UnknownError', 'priority': request.priority,
               'callback': request.callback.__name__}  # 日志用

3.2. 爬取站点以及链接检查。

2018-03-17 00:10:29 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET https://www.amazon.com/s/ref=lp_3734591_nr_n_6/143-5700955-1921713?fst=as%3Aoff&rh=n%3A1055398%2Cn%3A%211063498%2Cn%3A1063278%2Cn%3A1063282%2Cn%3A3734591%2Cn%3A3734671&bbn=3734591&ie=UTF8&qid=1517900687&rnid=3734591> (failed 1 times): User timeout caused connection failure: Getting https://www.amazon.com/s/ref=lp_3734591_nr_n_6/143-5700955-1921713?fst=as%3Aoff&rh=n%3A1055398%2Cn%3A%211063498%2Cn%3A1063278%2Cn%3A1063282%2Cn%3A3734591%2Cn%3A3734671&bbn=3734591&ie=UTF8&qid=1517900687&rnid=3734591 took longer than 20.0 seconds..
2018-03-17 00:10:29 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET https://www.amazon.com/s/ref=lp_3422251_nr_n_8/134-3091133-0771864?fst=as%3Aoff&rh=n%3A3375251%2Cn%3A%213375301%2Cn%3A10971181011%2Cn%3A3407731%2Cn%3A3422251%2Cn%3A7261122011&bbn=3422251&ie=UTF8&qid=1517900684&rnid=3422251> (failed 1 times): User timeout caused connection failure: Getting https://www.amazon.com/s/ref=lp_3422251_nr_n_8/134-3091133-0771864?fst=as%3Aoff&rh=n%3A3375251%2Cn%3A%213375301%2Cn%3A10971181011%2Cn%3A3407731%2Cn%3A3422251%2Cn%3A7261122011&bbn=3422251&ie=UTF8&qid=1517900684&rnid=3422251 took longer than 20.0 seconds..

  • 结论2:发现这些失败的链接基本上都能在浏览器中打开,说明站点和本地网络的联通度没有问题。

3.3. 本地网络和代理网络检查。

3.3.1. 本地网络检查

  • 可以选择三种方式来确认:
  • 第一种:找专门的网速测试网站,进行测试。
    这里写图片描述
    这里写图片描述
  • 第二种:360宽带测试。
    这里写图片描述
  • 第三种:编写脚本,直接爬取对应站点,观察所需的时间。
  • 其实,到这一步的时候,就应该看出问题所在了,只是当时有盲点,只测试了amazon站,而没有去测试amztracker站,导致后面走了很多弯路。不说了,看看走的弯路吧…
The speed result of not use proxy for amazon detail page. 
No_proxy Totalurls:20, successCount:20, totalSuccessTime:68.56400000000001, avgTime:3.4282000000000004, connectFailCount:0, proxyFailCount:0
  • 结论3:本地网络连通度和速度都没有问题。

3.3.2. 代理网络检查

Amazon Totalurls:20, successCount:14, totalSuccessTime:104.4075, avgTime:7.457678571428572, connectFailCount:0, proxyFailCount:6
  • 于是找到阿布云代理,详细了解了他们代理的一些信息,比如说动态IP的时效性是20(为了提高爬虫速度,将timeout时间设置为了20s,这才是最合理的),然后请他们提供了一下我的代理使用情况的统计数据:
    这里写图片描述
  • 这是按天统计的数据,从这份数据中可以看到,每天scrapy向代理发送的请求数(下载流量/请求(KB))基本上维持不变,下载时长也一致,但是下载的数据量(下载流量/分(KB), 累计下载(MB))明显变少。
  • 说明什么问题?:说明爬虫发出去的请求量没变,但是代理爬取下来的数据量明显变少,也就是说代理没法爬下来数据,问题在出在代理方

4. 故障原因

  • 然后在原有爬虫设置的基础之上,分别来跑 timeout 的url,最后发现:当跑amztracker站的链接时,在不加代理的情况下,是可以抓下来的。
2018-03-22 14:09:02 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.amztracker.com/unicorn.php?rank=189599&category=Sports+%26+Outdoors> (referer: www.amazon.com)
  • 但是在加代理的情况下,就发现这个amztracker站的链接都抓不下来。
# 在middleware.py中增加代理的情况下,会无法抓下来

18-03-21 11:09:22 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET https://www.amztracker.com/unicorn.php?rank=189599&category=Sports+%26+Outdoors> (failed 1 times): User timeout caused connection failure: Getting https://www.amztracker.com/unicorn.php?rank=189599&category=Sports+%26+Outdoors took longer than 20.0 seconds..
  • 也就发现,是代理无法抓到amztracker这个站的页面。所以找到阿布云的客服人员,最终发现原因是:因为是召开2018全国两会期间,对国外站进行了管控,阿布云这边对amztracker站进行了屏蔽,后来他们将这个站的屏蔽打开,问题得以最终解决。

  • 最终总结:其实在一开始的时候,就有机会很快分析问题的所在的。重点是做到心中有数,知道自己爬取了哪些页面,这些页面是否都能爬取,这些页面在加代理的情况下是否能爬取,需要做这样的测试。如果一开始就做了这样的测试,结果很快就出来了,而不用折腾这么久。

  • 我们再看一下,爬虫在正常情况下,上传和下载的速度的对比情况如下,一旦爬虫异常,从速度上就可以观测得到:
    这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

故障分析系列(01) —— scrapy爬虫速度突然变慢原因分析 的相关文章

  • [python知识] 爬虫知识之BeautifulSoup库安装及简单介绍

    一 前言 在前面的几篇文章中我介绍了如何通过Python分析源代码来爬取博客 维基百科InfoBox和图片 其文章链接如下 python学习 简单爬取维基百科程序语言消息盒 Python学习 简单网络爬虫抓取博客文章及思想介绍 python
  • 自学Python爬虫学到什么程度?就可以去找工作了?

    确立目标 了解需求 首先我们要先定位自己的目标 当然我们先以爬虫工程师来做个说明 去招聘网上看看需求都有哪些 直接做个拉勾网爬虫 结果了 仔细看看 我们可以得出以下几点 1 python 不是唯一可以做爬虫的 很多语言都可以 尤其是 jav
  • Python实现超简单【抖音】无水印视频批量下载

    前言 本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 版权归原作者所有 如有问题请及时联系我们以作处理 作者 python乱炖 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资
  • 爬取中国移动用户问答

    最近一个好朋友在搞爬虫 问了很多问题 所以干脆直接写了一个范例 这个程序整体要两次解析网页 第一层是分析网页中的json数据来获取qtid 第二层是用qtid来解析获得问答所在的网页 因为在问答网页里的数据存储是引用的数据库中的数据 所以不
  • Python 爬虫库以及库函数总结&&踩坑

    1 Re库的基本使用 Re库介绍 Re库是Python的标准库 主要用于字符串匹配 调用方式 import re 正则表达式的表示类型 raw string类型 原生字符串类型 re库采用raw string类型表示正则表达式 表示为 r
  • 用Python分析2000款避孕套,得出这些有趣的结论

    前言 本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 如有问题请及时联系我们以作处理 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可加入 一 分析目标
  • sublime text3下搭建Python IDE--Anaconda插件(自动补全)

    今天自己想在sublime text3下装个python自动补全插件 当安装一个包管理器时 Package Contral 时 ctrl shift p输入Install Package时 总是报错说没有这个包 在网上也找了很多解决办法 有
  • Python爬虫常见异常及解决办法

    文章目录 1 selenium common exceptions WebDriverException Message unknown error cannot find Chrome binary 方法一 配置参数 方法二 修改源文件
  • 入门Python必备100道练习题

    给大家整理了这份今天给大家分享100道Python练习题 在此之前 先给大家推荐一个工具 是一个对 Python 运行原理进行可视化分析的工具 Python Tutor 点击 Next 按钮就会根据执行步骤显示原理 对新手理解代码运行原理有
  • Python爬虫(一):编写简单爬虫之新手入门

    最近学习了一下python的基础知识 大家一般对 爬虫 这个词 一听就比较熟悉 都知道是爬一些网站上的数据 然后做一些操作整理 得到人们想要的数据 但是怎么写一个爬虫程序代码呢 相信很多人是不会的 今天写一个针对新手入门想要学习爬虫的文章
  • 零基础学Python

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 某乎搜索接口x-zse-96参数逆向学习分析,网站:aHR0cHM6Ly93d3cuemhpaHUuY29tLw==

    目标参数 x zse 96 参数分析 全局搜索x zse 96 只有两个地方出行 打上断点后刷新网页 从图中断点地方可以看到 搞清楚u f s 的由来就解决了x zse 96 可以看到s参数是由以下几部分组成 1 101 3 2 0 固定版
  • 跳过selenium检测爬取淘宝直通车

    最近 有对阿里商家端进行一些数据爬取 这次爬取的是直通车人群溢价数据 发现对selenium的检测相当厉害 然而我的回答是 你强任你强 清风拂山岗 咱人工登录怕过谁 什么cokies user agent selenium检测 token
  • Python 快速验证代理IP是否有效

    有时候 我们需要用到代理IP 比如在爬虫的时候 但是得到了IP之后 可能不知道怎么验证这些IP是不是有效的 这时候我们可以使用Python携带该IP来模拟访问某一个网站 如果多次未成功访问 则说明这个代理是无效的 代码如下 import r
  • 新路子!chatGPT+Python爬虫接私单怎么玩?

    就在这两天 关于ChatGPT的疾呼突然在社交平台上刷屏 很多人发现自己的号已经不在了 用户们感到前所未有的惶恐 已经有不少公司把 chatGPT引入工作流 未来已来 AI智能时代真的来了 普通人如何在智能时代谋求发展 这里提供一个思路 c
  • 05笔趣阁小说爬取--爬取作者所有小说

    前面的程序已经实现了从笔趣阁自动爬取整部小说 接下来在之前的基础上 将功能进一步扩展 实现自动爬取某一作者在笔趣阁中的所有小说 继续以方想为例 下图是方想作品列表的页面 https www 52bqg com modules article
  • 6个Python童年小游戏,开始敲起来,玩吧!

    你的童年 我的童年好像都一样 谁的童年又没玩过游戏呢 这些小游戏应该只有玩过才会懂吧 虽然程序员敲代码多年 但童心还是一直都在的 今天就分享一些私藏的童年游戏 十几行代码就能进入使用Python开发的小游戏快乐玩耍 1 五子棋 童年游戏不可
  • python3GUI--抖音无水印视频下载工具(附源码)

    文章目录 一 准备工作 二 预览 0 复制抖音分享短链接 1 启动 2 运行 3 结果 三 设计流程 1 总体设计 2 详细设计 四 源代码 五 说明 总结 hello 大家好啊 失踪人口回归了 捂脸 本次使用tkinter撰写一篇 抖音无
  • Python获取去哪儿旅游数据并作可视化攻略

    嗨喽 大家好呀 这里是爱看美女的茜茜呐 开发环境 版 本 python 3 8 编辑器 pycharm 第三方库 requests gt gt gt pip install requests parsel gt gt gt pip inst
  • 为什么要学习Python?

    前言 Python 是当今非常流行的编程语言 在互联网上经常可以看到他的身影 它应用非常广泛 例如编程 Web 开发 机器学习和 数据科学Q 等 TIOBE 官网近日公布了 2023 年 8 月的编程语言排行榜 Python 依然排行第一

随机推荐

  • mybatis批量插入后获取自增ID

    mybatis批量插入后获取自增ID 上代码 Mapper java 批量新增产品元素 param elementList 产品元素列表 return 结果 public int insertOrderElement List
  • 分享常用的开发资源

    前言 分享一些本人工作至今整理的一些资源 主要是包括工作 生活 博文中用到的文档 软件和网站 1 文档暂时未整理好 就先不放上来 如需要某方面的文档 可以联系本人 如果有的话可以进行分享 包括但不限于java 大数据 Python SQL等
  • DC-DC的功率电感 是越大越好? 还是越小越好?

    DC DC的功率电感 是越大越好 还是越小越好 问题 DC DC的功率电感 是越大越好 还是越小越好 回答 刚刚好最好 过大过小都不好 首先由公式可知 电感值越大 其Ripple越小 亦即电流越稳定 进而降EMI辐射干扰 但过大的电感值 会
  • 微信小程序之map地图规划路线以及显示距离

    有个问题 在选择公交路线 包含步行和公交 时 怎么才能让不同的路线显示不同的颜色 ps 有个方式 自己写坐标解压往后的存入新数组 把步行时的数据标注下 有什么简单的方法呢 自定义函数文件 自动获取定位信息 function getLocat
  • Kraken:一款基于爆破技术的多平台分布式密码安全测试工具

    关于Kraken Kraken是一个功能强大的多平台在线分布式密码安全测试工具 该平台基于暴力破解技术来实现对密码安全性的测试 并允许广大研究人员在多台设备上以并行处理的方式遍历字典 基于crunch字典生成器 除此之外 该工具不仅可以通过
  • 密码学替代密码

    1 请指出一般替代密码的明文空间 密文空间和密钥空间各是什么 明文空间M和密文空间C都是26个英文字母的集合 密钥空间K Z 26 gt Z 26 是置换 是所有可能置换的集合 2 单表替代密码和多表替代密码的主要特点是什么 单表替代密码
  • python读取文件名存到list_Python之从文件读取数据到list的实例

    本篇文章小编为大家分享一篇Python之从文件读取数据到list的实例讲解 文章中有代码列出供大家参考 本篇文章具有很好的参考价值 希望对大家有所帮助 下面随扣丁学堂Python培训小编一起来看一下Python之从文件读取数据到list的实
  • TJmaie - 阅读作业

    读了邹老师的讲义以及移山之道 有不小的收获 不过按要求 先说说疑问吧 由于邹老师大多都以讲故事的方式来讲道理 严格意义上来说 是很难找到 错误 的 只是各人认不认同罢了 我在团队中的身份是Dev 我也重点关注了这一块 顶级程序员的心得 Co
  • jeesite学习笔记——新增一条信息时同步创建用户

    1 效果 截图 添加一条个人信息时同步创建它的用户信息 2 部分代码展示 因为要为个人同步创建 主体在 个人信息 模块 与 用户信息 添加模块无关 只会调用它的部分方法 所以所有代码都在 个人信息 模块进行操作 2 1因为操作涉及到两个数据
  • STM32 IAP 在线升级详解

    扩展 IAP主要用于产品出厂后应用程序的更新作用 考虑到出厂时要先烧写IAP 再烧写APP应用程序要烧写2次增加工人劳动力基础上写了 STM32 IAP APP gt 双剑合一 链接稍后发 一 在进入主题之前我们先了解一些必要的基础知识 s
  • JSON parse error: Invalid UTF-8 解决办法系列

    今天在本地测试通过的代码 部署之Tomcat 服务器 前端同事给我反馈如下的错误信息 Request exception org springframework http converter HttpMessageNotReadableEx
  • mciSendString函数

    mciSendString open1 GetBuffer open1 GetLength buf sizeof buf NULL 来自
  • tinystl实现(第七步:Utility.h)

    经过长时间的学习终于可以开始tinystl的仿 chao 写工作了 本文参考了这位大佬的github 坦白讲我只是补充了注释 因为tinystl的代码真的非常经典而我又没什么这种大型项目的经验 所以只能这样做 不过相信能够有助于大家的学习
  • 图像加权运算

    import os import re import cv2 cv2 imshow image img 显示 cv2 waitKey 10000 停留 cv2 destroyAllWindows 关闭 from PIL import Ima
  • java 开源 聊天机器人_用Java实现基于Web端的AI机器人聊天

    本文详细介绍了如何用Java实现Web聊天机器人 通过创建一个新项目来学习一下 一 创建一个新项目 添加所需的依赖项 打开pom xml文件在IDE中 将下列内容添加到区域 JCenterhttps jcenter bintray com
  • 去国企1年后,我后悔了!重回大厂内卷

    文章来源 cnblogs com peiyu1988 html 01 前言 2019年初 我通过一整天的笔试及面试加入一家 某一线城市国资委全资控股 某集团的研究机构 中央研究院 任职高级软件工程师 中级职称 在这边工作了整整一年 目前已经
  • 图的深度优先遍历(非递归+递归,详解)

    图的深度优先遍历 非递归算法 include
  • 关于JAVA中LIST元素修改的一个问题记录

    在工作中有遇到一个问题 需要从既有获取数据库中的LIST数据 做一下对其中部分数据做处理存入另外一个LIST集合之中 但是 有些现象还是比较出乎我的意料的 模拟了一下相关场景 具体的代码如下 package com interview de
  • 程序员工作压力大,为什么还这么多人想做程序员?是因为喜欢吗?

    最近过年遇到很多亲戚和朋友 不知道大家的身边是怎样的 阿粉身边的亲戚朋友从事计算机相关的还是挺少的 很多还是从事一些传统行业 最近跟一个亲戚聊天的时候就聊到网上对程序员的一些刻板影响 什么格子衫呀 拖鞋短裤呀 脱发以及 35 岁劝退等这些东
  • 故障分析系列(01) —— scrapy爬虫速度突然变慢原因分析

    故障分析系列 01 scrapy爬虫速度突然变慢原因分析 1 问题背景 在所有环境都没变的情况下 scrapy爬虫每天能爬取的数据量从3月5号开始急剧减少 后面几天数据量也是越来越少 2 环境 系统 win7 python 3 6 1 sc