使用scrapy的定制爬虫-近期

本文分享了Scrapy爬虫项目的实践经验,包括定制WebKit支持JS、优化解析速度、改进Scrapy框架性能及缓存机制等内容。

近期我的爬虫写完了-.-没有足够的资源(服务器,带宽)来跑.so这个项目暂放一下先找工作了.

简单说下后面的内容要点.
定制webkit:
1,主要作用是:支持js,另可快速解析被hide了的干扰元素(页面中的非显示内容).这点用webpage的toPlainText即可...优化方面:1,缓存webkit进程实例.2,通过一些比较hack的方法,把css给禁了(定制manager.createRequest).3,其他一些配置项.例如webkit开启preferNetwork来支持标准的http cache...主要就这几个了...

2,scrapy本身的优化方面:
scrapy本身很多东西优化(例如dnscache)都是已经完成了的,请先仔细阅读文档,必要时源码.业务相关的部分,建议注意正则解析速率(可采取先写逻辑大致提取后再正则).解析写的不好会导致cpu占用高(若无法优化.考虑解析和爬取完全分离是否可行).这些都是具体情况具体处理了.
说下scrapy框架的优化.
1,scrapy使用短连接.可使用requests+scrapy.utils里面的deferinthread快速patch成长连接,但deferinthread用到了线程池,因此网络方面改善了但调度方面变差了(由twisted异步变为线程池).请评估.有时间我会给scrapy写个长链接支持,在twisted基础上.
2,考虑给scrapy实现标准的http cache,也可通过代理服务器快速patch一个http  cache(无需改动代码).看具体情况了.

3,scrapy的一些细节:
同上scrapy很多细节也替你做了(例如url规范化),请先仔细阅读文档,必要时源码.其他一些细节
1,default_headers,添加host头,否则会导致部分虚拟空间无法访问
2,链接解析中,a tag的href,写rule中的ProcessLink,记得strip,有些网站有类似如下的<a href=' xxxx'>前面有个空格,会导致scrapy的链接解析错误(但浏览器访问正常)
3,是否要支持iframe.即写链接解析时考虑iframe元素处理
4,etc...略想不起来...

4,架构,运行监控方面:
这个跟具体情况有关...简单说下,你要考虑spider如何写,是否多crawler...crawler和spider的对应关系...一般情况你不需要考虑这个问题(绝大多数都是crawler,spider一对一).

其他...etc...回想中...

后续我又看了很多有趣的spider trap-.-不过突破防爬取不会被提及.
也弄了下gevent-.-结论是除非你清楚你在干啥...否则还是用scrapy吧...
正在学习爬虫相关的算法中...

-.-系列文先暂停在此了...

转载于:https://my.oschina.net/u/1024140/blog/124577

<think>我们参考用户提供的引用内容,特别是引用[1][2][3][4]都提到了使用scrapy-fake-useragent库来设置随机User-Agent中间件。 用户的问题:如何在Scrapy中集成scrapy-fake-useragent来自定义下载中间件。 步骤: 1. 安装scrapy-fake-useragent库 2. 在settings.py中配置DOWNLOADER_MIDDLEWARES,禁用默认的UserAgent中间件,并启用scrapy-fake-useragent提供的中间件 3. 可选:配置Retry中间件(如果需要重试时也更换User-Agent) 具体步骤: 1. 安装scrapy-fake-useragent 使用pip安装: ```bash pip install scrapy-fake-useragent ``` 2. 配置settings.py 在Scrapy项目的settings.py文件中,进行如下配置: ```python # 禁用Scrapy默认的UserAgentMiddleware DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400, # 如果需要在使用相同User-Agent失败后重试时更换User-Agent,可以启用RetryUserAgentMiddleware 'scrapy_fake_useragent.middleware.RetryUserAgentMiddleware': 401, } # 可选:配置重试中间件(如果启用了RetryUserAgentMiddleware,通常需要同时启用重试中间件) # 注意:默认的RetryMiddleware优先级为550,我们这里使用RetryUserAgentMiddleware(优先级401)来替换它 # 如果不想替换,也可以同时使用,但要注意优先级顺序,避免冲突 # 这里我们禁用默认的RetryMiddleware,用RetryUserAgentMiddleware代替 DOWNLOADER_MIDDLEWARES.update({ 'scrapy.downloadermiddlewares.retry.RetryMiddleware': None, 'scrapy_fake_useragent.middleware.RetryUserAgentMiddleware': 401, # 优先级在RandomUserAgentMiddleware之后 }) # 设置重试次数 RETRY_TIMES = 5 # 重试次数,根据实际情况调整 ``` 注意:引用[4]中给出了类似的配置,但用户需要根据自己的项目调整。 3. 关于优先级: - RandomUserAgentMiddleware设置为400(在默认UserAgentMiddleware的位置,但默认UserAgentMiddleware已被禁用) - RetryUserAgentMiddleware设置为401(紧接着RandomUserAgentMiddleware执行,并且它替代了默认的RetryMiddleware) 4. 如果不需要在重试时更换User-Agent,可以只使用RandomUserAgentMiddleware,并保留默认的RetryMiddleware(但注意优先级顺序,默认RetryMiddleware优先级为550,所以不会冲突)。配置如下: ```python DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400, # 不替换RetryMiddleware,所以不需要设置RetryUserAgentMiddleware } # 此时默认的RetryMiddleware(优先级550)仍然启用 ``` 5. 验证:运行爬虫,观察请求头中的User-Agent是否随机变化。 注意事项: - 使用scrapy-fake-useragent库后,它会自动从fake-useragent库中获取随机的User-Agent字符串。 - 如果遇到无法获取User-Agent列表的情况(比如网络问题),可以设置备用User-Agent,或者使用本地缓存。具体可参考该库的文档。 如果用户需要自定义User-Agent列表,可以设置FAKEUSERAGENT_PROVIDERS,但通常使用默认的即可。 参考引用[1][2][3][4]的内容,我们完成了集成。 注意:引用[5]中提到了自定义中间件的位置(在middlewares.py中定义),但这里我们使用的是第三方库,所以不需要自己编写中间件类,只需要配置即可。 因此,总结步骤为:安装库 -> 配置settings.py -> 运行爬虫。 如果用户需要进一步定制,可以查看scrapy-fake-useragent的文档:https://gitcode.com/gh_mirrors/sc/scrapy-fake-useragent 现在,我们生成相关问题。</think>### 在Scrapy中集成scrapy-fake-useragent实现自定义下载中间件 #### 安装依赖 ```bash pip install scrapy-fake-useragent ``` #### 配置settings.py ```python # 禁用Scrapy默认的UserAgent中间件 DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, # 启用随机UserAgent中间件 'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400, # 可选:启用重试时更换UserAgent的中间件 'scrapy_fake_useragent.middleware.RetryUserAgentMiddleware': 401 } # 可选:配置重试策略 RETRY_TIMES = 3 # 重试次数 RETRY_HTTP_CODES = [500, 502, 503, 504, 408] # 需要重试的状态码 ``` #### 工作原理说明 1. **`RandomUserAgentMiddleware`** (优先级400) - 自动为每个请求生成随机User-Agent - 基于fake-useragent库的预定义UA列表[^2] - 完全替代Scrapy默认的UserAgentMiddleware 2. **`RetryUserAgentMiddleware`** (优先级401) - 当请求失败重试时自动更换新的User-Agent - 需配合Scrapy的重试机制使用 - 优先级需高于默认重试中间件(550)[^4] #### 自定义扩展配置 ```python # 指定UA类型(桌面/移动设备) FAKEUSERAGENT_PROVIDERS = [ 'scrapy_fake_useragent.providers.FakeUserAgentProvider', # 默认 'scrapy_fake_useragent.providers.FixedUserAgentProvider', # 固定UA ] # 设置UA类型偏好(默认随机混合) FAKEUSERAGENT_FALLBACK = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit...' # 自定义UA列表(覆盖默认) CUSTOM_USER_AGENT_LIST = [ 'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15...', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36...' ] ``` #### 验证配置效果 在spider中添加检查代码: ```python def parse(self, response): print("当前User-Agent:", response.request.headers.get('User-Agent')) ``` > 提示:可通过`scrapy shell`命令实时测试中间件效果,观察请求头的动态变化[^1][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值