scrapy retry times用代理请求retry的时候会更换代理吗

拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3a6cbb-ua98).
重新安装浏览器,或使用别的浏览器(nongtergen)
(dandingla)
第三方登录:Scrapy之旅(1):使用http_proxy - 推酷
Scrapy之旅(1):使用http_proxy
之前用Scrapy做过几个项目,但都是从别人手里接过来的项目,当时做的也很匆忙,完全就是按照文档一点点攒代码的。Scrapy的强大大家都是知道的,所以打算对Scrapy进行系统的学习。
要学习Scrapy首先就是要确定爬取的站,刚好我这里需要爬取Slideshare的一些文档,没想到Slideshare竟然被墙,所以这里先讲解如何解决墙的问题。翻墙的解决方案有很多,但是Scrapy只支持http代理,因此这篇文章会主要介绍如何让Scrapy使用http代理翻墙。
方案一:国外VPS
最简单得翻墙方案,就是将Scrapy直接部署在国外的VPS上,这个就不多说,原理大家都懂的。
方案二:使用openVPN
openVPN可以说是最好的开源VPN,使用openVPN需要一台在墙外的VPS作为Server端,然后将部署Scrapy的机器作为客户端去连接,但是这个同样需要一台VPS。
方案三:使用HTTP代理
为什么使用HTTP代理
翻墙是每个程序员必备的技能,一直使用的ShadowSocks代理,它是Socket代理,但是Scrapy并不支持Socket代理,所以有一个想法就是将Socket代理转换为HTTP代理,没想到还真有解决方案。
将Scoket代理转换为HTTP代理
使用privoxy转换:
apt-get install privoxy
#change the config file
vi /etc/privoxy/config
#add one of the following lines depend on your socket type
forward-socks5 /
forward-socks4a /
#restart it
/etc/init.d/privoxy restart
使用polipo转换:
install polipo
service polipo
polipo socksParentProxy=localhos
除了这两种方式,还有其他很多种转换方法,大家可以选择自己喜欢得使用。
编写代理使用代码randomproxy.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
RandomProxy
(self, settings)
self.proxy_list = settings.get(
'PROXY_LIST'
fin = open(self.proxy_list)
self.proxies = {}
fin.readlines():
parts = re.match(
'(\w+://)(\w+:\w+@)?(.+)'
# Cut trailing @
parts.group(
user_pass = parts.group(
user_pass =
self.proxies[parts.group(
) + parts.group(
)] = user_pass
fin.close()
@classmethod
from_crawler
(cls, crawler)
cls(crawler.settings)
process_request
(self, request, spider)
# Don't overwrite with a random one (server-side state for IP)
request.meta:
proxy_address = random.choice(self.proxies.keys())
proxy_user_pass = self.proxies[proxy_address]
request.meta[
] = proxy_address
proxy_user_pass:
basic_auth =
+ base64.encodestring(proxy_user_pass)
request.headers[
'Proxy-Authorization'
] = basic_auth
process_exception
(self, request, exception, spider)
proxy = request.meta[
'Removing failed proxy &%s&, %d proxies left'
proxy, len(self.proxies)))
self.proxies[proxy]
ValueError:
修改配置文件settings.py
# Retry many times since proxies often fail
RETRY_TIMES =
# Retry on most error codes since proxies fail for different reasons
RETRY_HTTP_CODES = [
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware'
# Fix path to
'yourspider.randomproxy.RandomProxy'
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware'
# Proxy list containing entries like
# http://host1:port
# http://username:password@host2:port
# http://host3:port
PROXY_LIST =
'/path/to/proxy/list.txt'
Scrapy使用HTTP代理的方式主要是通过
HttpProxyMiddleware
中间件完成。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致用户名:网页采集
文章数:44
访问量:60267
注册日期:
阅读量:1297
阅读量:3317
阅读量:461218
阅读量:1145683
51CTO推荐博文
上一篇文章中写了如何让scrapy支持HTTP代理不过scrapy默认是不支持socks代理的,有时候纯HTTP代理又容易被G F W拦截,采集国外被屏蔽的网站又需要用到代理,好吧,能力是被需求逼出来的。下面说一个解决方案在美国或香港部署一台linux vps以debian为例安装必要组件apt-get&install&build-essential&autoconf&libtool&libssl-dev&gcc&-y安装gitapt-get&install&git&-y下载shadowsocks-libev源码包并编译&git&clone&/madeye/shadowsocks-libev.git
cd&shadowsocks-libev&
./configure&
make&&&&make&install运行shadowsocks/usr/local/bin/ss-server&-s&0.0.0.0&-p&端口&-k&密码&-m&加密方式&&本地服务器(可以是windows或linux)去下载对应系统的shadowsocks客户端另外shadowsocks客户端可以指定多个服务器,相当于做了一个代理池最关键的步骤来了,就是将socks代理转换成http代理这里推荐用3Proxy,主页在。3Proxy支持windows和linux等各种平台。windows下直接下载安装即可,Linux下面需要自己编译3Proxy的典型配置文件nscache&65536
timeouts&1&5&30&60&180&
#external&ip
internal&127.0.0.1
auth&iponly
allow&127.0.0.1
parent&1000&socks5+&127.0.0.1&9999
proxy&-n&-a&-p1984127.0.0.1即上一级socks5代理服务器,9999为代理服务器端口1984为监听端口更详细的设置可参考这篇文章 或阅读官方文档最后将scrapy的HTTP代理设置为就可以了参考文档
了这篇文章
类别:┆阅读(0)┆评论(0)博主录制的Python3爬虫视频教程已发布!详情请戳!希望大家支持!非常感谢!
> 小白进阶之Scrapy第三篇(基于Scrapy-Redis的分布式以及cookies池)
啥话都不说了、进入正题。
首先我们更新一下scrapy版本。最新版为1.3
再说一遍Windows的小伙伴儿 pip是装不上Scrapy的。推荐使用anaconda 、不然还是老老实实用Linux吧
conda install scrapy==1.3
pip install scrapy==1.3
conda install scrapy==1.3或者pip install scrapy==1.3
安装Scrapy-Redis
conda install scrapy-redis
pip install scrapy-redis
conda install scrapy-redis或者pip install scrapy-redis
需要注意:
Python 版本为 2.7,3.4 或者3.5 。个人使用3.6版本也没有问题
Redis&=2.8
Scrapy&=1.0
Redis-py&=2.1 。
3.X版本的Python 都是自带Redis-py 其余小伙伴如果没有的话、自己 pip 安装一下。
开始搞事!
开始之前我们得知道scrapy-redis的一些配置:PS 这些配置是写在Scrapy项目的settings.py中的!
scrapy-redis配置文件
#启用Redis调度存储请求队列
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
#确保所有的爬虫通过Redis去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
#默认请求序列化使用的是pickle 但是我们可以更改为其他类似的。PS:这玩意儿2.X的可以用。3.X的不能用
#SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"
#不清除Redis队列、这样可以暂停/恢复 爬取
#SCHEDULER_PERSIST = True
#使用优先级调度请求队列 (默认使用)
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
#可选用的其它队列
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'
#最大空闲时间防止分布式爬虫因为等待而关闭
#SCHEDULER_IDLE_BEFORE_CLOSE = 10
#将清除的项目在redis进行处理
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300
#序列化项目管道作为redis Key存储
#REDIS_ITEMS_KEY = '%(spider)s:items'
#默认使用ScrapyJSONEncoder进行项目序列化
#You can use any importable path to a callable object.
#REDIS_ITEMS_SERIALIZER = 'json.dumps'
#指定连接到redis时使用的端口和地址(可选)
#REDIS_HOST = 'localhost'
#REDIS_PORT = 6379
#指定用于连接redis的URL(可选)
#如果设置此项,则此项优先级高于设置的REDIS_HOST 和 REDIS_PORT
#REDIS_URL = 'redis://user:pass@hostname:9001'
#自定义的redis参数(连接超时之类的)
#REDIS_PARAMS
#自定义redis客户端类
#REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient'
#如果为True,则使用redis的'spop'进行操作。
#如果需要避免起始网址列表出现重复,这个选项非常有用。开启此选项urls必须通过sadd添加,否则会出现类型错误。
#REDIS_START_URLS_AS_SET = False
#RedisSpider和RedisCrawlSpider默认 start_usls 键
#REDIS_START_URLS_KEY = '%(name)s:start_urls'
#设置redis使用utf-8之外的编码
#REDIS_ENCODING = 'latin1'
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
#启用Redis调度存储请求队列SCHEDULER = "scrapy_redis.scheduler.Scheduler"&#确保所有的爬虫通过Redis去重DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"&#默认请求序列化使用的是pickle 但是我们可以更改为其他类似的。PS:这玩意儿2.X的可以用。3.X的不能用#SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"&#不清除Redis队列、这样可以暂停/恢复 爬取#SCHEDULER_PERSIST = True&#使用优先级调度请求队列 (默认使用)#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'#可选用的其它队列#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'&#最大空闲时间防止分布式爬虫因为等待而关闭#SCHEDULER_IDLE_BEFORE_CLOSE = 10&#将清除的项目在redis进行处理ITEM_PIPELINES = {&&&&'scrapy_redis.pipelines.RedisPipeline': 300}&#序列化项目管道作为redis Key存储#REDIS_ITEMS_KEY = '%(spider)s:items'&#默认使用ScrapyJSONEncoder进行项目序列化#You can use any importable path to a callable object.#REDIS_ITEMS_SERIALIZER = 'json.dumps'&#指定连接到redis时使用的端口和地址(可选)#REDIS_HOST = 'localhost'#REDIS_PORT = 6379&#指定用于连接redis的URL(可选)#如果设置此项,则此项优先级高于设置的REDIS_HOST 和 REDIS_PORT#REDIS_URL = 'redis://user:pass@hostname:9001'&#自定义的redis参数(连接超时之类的)#REDIS_PARAMS&&= {}&#自定义redis客户端类#REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient'&#如果为True,则使用redis的'spop'进行操作。#如果需要避免起始网址列表出现重复,这个选项非常有用。开启此选项urls必须通过sadd添加,否则会出现类型错误。#REDIS_START_URLS_AS_SET = False&#RedisSpider和RedisCrawlSpider默认 start_usls 键#REDIS_START_URLS_KEY = '%(name)s:start_urls'&#设置redis使用utf-8之外的编码#REDIS_ENCODING = 'latin1'
请各位小伙伴儿自行挑选需要的配置写到项目的settings.py文件中
英语渣靠Google、看不下去的小伙伴儿看这儿:http://scrapy-redis.readthedocs.io/en/stable/readme.html
继续在我们上一篇博文中的爬虫程序修改:
首先把我们需要的redis配置文件写入settings.py中:
如果你的redis数据库按照前一片博文配置过则需要以下至少三项
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://root:密码@主机IP:端口'
SCHEDULER = "scrapy_redis.scheduler.Scheduler"&DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"&REDIS_URL = 'redis://root:密码@主机IP:端口'
第三项请按照你的实际情况配置。
Nice配置文件写到这儿。我们来做一些基本的反爬虫设置
最基本的一个切换UserAgent!
首先在项目文件中新建一个useragent.py用来写一堆 User-Agent(可以去网上找更多,也可以用下面这些现成的)
一堆的User-Agent
agents = [
"Mozilla/5.0 (L U; Android 2.3.6; en- Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Avant Browser/1.2.789rel1 ()",
"Mozilla/5.0 (W U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
"Mozilla/5.0 (W U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
"Mozilla/5.0 (W U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
"Mozilla/5.0 (W U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
"Mozilla/5.0 (W U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
"Mozilla/5.0 (W U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
"Mozilla/5.0 (W U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/ Minefield/3.0.2pre",
"Mozilla/5.0 (W U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/ Firefox/3.0.10",
"Mozilla/5.0 (W U; Windows NT 6.0; en-GB; rv:1.9.0.11) Gecko/ Firefox/3.0.11 (.NET CLR 3.5.30729)",
"Mozilla/5.0 (W U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/ Firefox/3.5.6 GTB5",
"Mozilla/5.0 (W U; Windows NT 5.1; rv:1.9.2.8) Gecko/ Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0E)",
"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/ Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0.1) Gecko/ Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/ Firefox/5.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/ Firefox/6.0a2",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/ Firefox/7.0.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b4pre) Gecko/ Minefield/4.0b4pre",
"Mozilla/4.0 ( MSIE 5.5; Windows NT 5.0 )",
"Mozilla/4.0 ( MSIE 5.5; Windows 98; Win 9x 4.90)",
"Mozilla/5.0 (W U; Windows XP) Gecko MultiZilla/1.6.1.0a",
"Mozilla/2.02E (Win95; U)",
"Mozilla/3.01Gold (Win95; I)",
"Mozilla/4.8 [en] (Windows NT 5.1; U)",
"Mozilla/5.0 (W U; Win98; en-US; rv:1.4) Gecko Netscape/7.1 (ax)",
"HTC_Dream Mozilla/5.0 (L U; Android 1.5; en- Build/CUPCAKE) AppleWebKit/528.5
(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
"Mozilla/5.0 (hp- L hpwOS/3.0.2; U; de-DE) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.40.1 Safari/534.6 TouchPad/1.0",
"Mozilla/5.0 (L U; Android 1.5; en- sdk Build/CUPCAKE) AppleWebkit/528.5
(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
"Mozilla/5.0 (L U; Android 2.1; en- Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
"Mozilla/5.0 (L U; Android 2.2; en- Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (L U; Android 1.5; en- htc_bahamas Build/CRB17) AppleWebKit/528.5
(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
"Mozilla/5.0 (L U; Android 2.1-update1; de- HTC Desire 1.19.161.5 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
"Mozilla/5.0 (L U; Android 2.2; en- Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (L U; Android 1.5; de- HTC Hero Build/CUPCAKE) AppleWebKit/528.5
(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
"Mozilla/5.0 (L U; Android 2.2; en- ADR6300 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (L U; Android 2.1; en- HTC Legend Build/cupcake) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
"Mozilla/5.0 (L U; Android 1.5; de- HTC Magic Build/PLAT-RC33) AppleWebKit/528.5
(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 FirePHP/0.3",
"Mozilla/5.0 (L U; Android 1.6; en- HTC_TATTOO_A3288 Build/DRC79) AppleWebKit/528.5
(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
"Mozilla/5.0 (L U; Android 1.0; en- dream) AppleWebKit/525.10
(KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
"Mozilla/5.0 (L U; Android 1.5; en- T-Mobile G1 Build/CRB43) AppleWebKit/528.5
(KHTML, like Gecko) Version/3.1.2 Mobile Safari 525.20.1",
"Mozilla/5.0 (L U; Android 1.5; en- T-Mobile_G2_Touch Build/CUPCAKE) AppleWebKit/528.5
(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
"Mozilla/5.0 (L U; Android 2.0; en- Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
"Mozilla/5.0 (L U; Android 2.2; en- Droid Build/FRG22D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (L U; Android 2.0; en- Milestone Build/ SHOLS_U2_01.03.1) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
"Mozilla/5.0 (L U; Android 2.0.1; de- Milestone Build/SHOLS_U2_01.14.0) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
"Mozilla/5.0 (L U; Android 3.0; en- Xoom Build/HRI39) AppleWebKit/525.10
(KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
"Mozilla/5.0 (L U; Android 0.5; en-us) AppleWebKit/522
(KHTML, like Gecko) Safari/419.3",
"Mozilla/5.0 (L U; Android 1.1; en- dream) AppleWebKit/525.10
(KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
"Mozilla/5.0 (L U; Android 2.0; en- Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
"Mozilla/5.0 (L U; Android 2.1; en- Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
"Mozilla/5.0 (L U; Android 2.2; en- Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (L U; Android 2.2; en- ADR6300 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (L U; Android 2.2; en- GT-P1000M Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (L U; Android 3.0.1; fr- A500 Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
"Mozilla/5.0 (L U; Android 3.0; en- Xoom Build/HRI39) AppleWebKit/525.10
(KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
"Mozilla/5.0 (L U; Android 1.6; es- SonyEricssonX10i Build/R1FA016) AppleWebKit/528.5
(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
"Mozilla/5.0 (L U; Android 1.6; en- SonyEricssonX10i Build/R1AA056) AppleWebKit/528.5
(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
agents = [&&&&"Mozilla/5.0 (L U; Android 2.3.6; en- Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",&&&&"Avant Browser/1.2.789rel1 ()",&&&&"Mozilla/5.0 (W U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",&&&&"Mozilla/5.0 (W U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",&&&&"Mozilla/5.0 (W U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",&&&&"Mozilla/5.0 (W U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",&&&&"Mozilla/5.0 (W U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",&&&&"Mozilla/5.0 (W U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",&&&&"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",&&&&"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",&&&&"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",&&&&"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",&&&&"Mozilla/5.0 (W U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/ Minefield/3.0.2pre",&&&&"Mozilla/5.0 (W U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/ Firefox/3.0.10",&&&&"Mozilla/5.0 (W U; Windows NT 6.0; en-GB; rv:1.9.0.11) Gecko/ Firefox/3.0.11 (.NET CLR 3.5.30729)",&&&&"Mozilla/5.0 (W U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/ Firefox/3.5.6 GTB5",&&&&"Mozilla/5.0 (W U; Windows NT 5.1; rv:1.9.2.8) Gecko/ Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0E)",&&&&"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/ Firefox/4.0.1",&&&&"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0.1) Gecko/ Firefox/4.0.1",&&&&"Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/ Firefox/5.0",&&&&"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/ Firefox/6.0a2",&&&&"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/ Firefox/7.0.1",&&&&"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b4pre) Gecko/ Minefield/4.0b4pre",&&&&"Mozilla/4.0 ( MSIE 5.5; Windows NT 5.0 )",&&&&"Mozilla/4.0 ( MSIE 5.5; Windows 98; Win 9x 4.90)",&&&&"Mozilla/5.0 (W U; Windows XP) Gecko MultiZilla/1.6.1.0a",&&&&"Mozilla/2.02E (Win95; U)",&&&&"Mozilla/3.01Gold (Win95; I)",&&&&"Mozilla/4.8 [en] (Windows NT 5.1; U)",&&&&"Mozilla/5.0 (W U; Win98; en-US; rv:1.4) Gecko Netscape/7.1 (ax)",&&&&"HTC_Dream Mozilla/5.0 (L U; Android 1.5; en- Build/CUPCAKE) AppleWebKit/528.5&&(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",&&&&"Mozilla/5.0 (hp- L hpwOS/3.0.2; U; de-DE) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.40.1 Safari/534.6 TouchPad/1.0",&&&&"Mozilla/5.0 (L U; Android 1.5; en- sdk Build/CUPCAKE) AppleWebkit/528.5&&(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",&&&&"Mozilla/5.0 (L U; Android 2.1; en- Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",&&&&"Mozilla/5.0 (L U; Android 2.2; en- Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",&&&&"Mozilla/5.0 (L U; Android 1.5; en- htc_bahamas Build/CRB17) AppleWebKit/528.5&&(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",&&&&"Mozilla/5.0 (L U; Android 2.1-update1; de- HTC Desire 1.19.161.5 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",&&&&"Mozilla/5.0 (L U; Android 2.2; en- Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",&&&&"Mozilla/5.0 (L U; Android 1.5; de- HTC Hero Build/CUPCAKE) AppleWebKit/528.5&&(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",&&&&"Mozilla/5.0 (L U; Android 2.2; en- ADR6300 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",&&&&"Mozilla/5.0 (L U; Android 2.1; en- HTC Legend Build/cupcake) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",&&&&"Mozilla/5.0 (L U; Android 1.5; de- HTC Magic Build/PLAT-RC33) AppleWebKit/528.5&&(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 FirePHP/0.3",&&&&"Mozilla/5.0 (L U; Android 1.6; en- HTC_TATTOO_A3288 Build/DRC79) AppleWebKit/528.5&&(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",&&&&"Mozilla/5.0 (L U; Android 1.0; en- dream) AppleWebKit/525.10&&(KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",&&&&"Mozilla/5.0 (L U; Android 1.5; en- T-Mobile G1 Build/CRB43) AppleWebKit/528.5&&(KHTML, like Gecko) Version/3.1.2 Mobile Safari 525.20.1",&&&&"Mozilla/5.0 (L U; Android 1.5; en- T-Mobile_G2_Touch Build/CUPCAKE) AppleWebKit/528.5&&(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",&&&&"Mozilla/5.0 (L U; Android 2.0; en- Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",&&&&"Mozilla/5.0 (L U; Android 2.2; en- Droid Build/FRG22D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",&&&&"Mozilla/5.0 (L U; Android 2.0; en- Milestone Build/ SHOLS_U2_01.03.1) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",&&&&"Mozilla/5.0 (L U; Android 2.0.1; de- Milestone Build/SHOLS_U2_01.14.0) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",&&&&"Mozilla/5.0 (L U; Android 3.0; en- Xoom Build/HRI39) AppleWebKit/525.10&&(KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",&&&&"Mozilla/5.0 (L U; Android 0.5; en-us) AppleWebKit/522&&(KHTML, like Gecko) Safari/419.3",&&&&"Mozilla/5.0 (L U; Android 1.1; en- dream) AppleWebKit/525.10&&(KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",&&&&"Mozilla/5.0 (L U; Android 2.0; en- Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",&&&&"Mozilla/5.0 (L U; Android 2.1; en- Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",&&&&"Mozilla/5.0 (L U; Android 2.2; en- Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",&&&&"Mozilla/5.0 (L U; Android 2.2; en- ADR6300 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",&&&&"Mozilla/5.0 (L U; Android 2.2; en- GT-P1000M Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",&&&&"Mozilla/5.0 (L U; Android 3.0.1; fr- A500 Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",&&&&"Mozilla/5.0 (L U; Android 3.0; en- Xoom Build/HRI39) AppleWebKit/525.10&&(KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",&&&&"Mozilla/5.0 (L U; Android 1.6; es- SonyEricssonX10i Build/R1FA016) AppleWebKit/528.5&&(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",&&&&"Mozilla/5.0 (L U; Android 1.6; en- SonyEricssonX10i Build/R1AA056) AppleWebKit/528.5&&(KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",]
现在我们来重写一下Scrapy的下载中间件(哇靠!!重写中间件 好高端啊!!会不会好难!!!放心!!!So Easy!!跟我做!包教包会,毕竟不会你也不能顺着网线来打我啊):
关于重写中间件的详细情况 请参考 官方文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/downloader-middleware.html#scrapy.contrib.downloadermiddleware.DownloaderMiddleware
在项目中新建一个middlewares.py的文件(如果你使用的新版本的Scrapy,在新建的时候会有这么一个文件,直接用就好了)
首先导入UserAgentMiddleware毕竟我们要重写它啊!
import json ##处理json的包
import redis #Python操作redis的包
import random #随机选择
from .useragent import agents #导入前面的
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware #UserAegent中间件
from scrapy.downloadermiddlewares.retry import RetryMiddleware #重试中间件
import json ##处理json的包import redis #Python操作redis的包import random #随机选择from .useragent import agents #导入前面的from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware #UserAegent中间件from scrapy.downloadermiddlewares.retry import RetryMiddleware #重试中间件
class UserAgentmiddleware(UserAgentMiddleware):
def process_request(self, request, spider):
agent = random.choice(agents)
request.headers["User-Agent"] = agent
class UserAgentmiddleware(UserAgentMiddleware):&&&&&def process_request(self, request, spider):&&&&&&&&agent = random.choice(agents)&&&&&&&&request.headers["User-Agent"] = agent
第一行:定义了一个类UserAgentmiddleware继承自UserAgentMiddleware
第二行:定义了函数process_request(request, spider)为什么定义这个函数,因为Scrapy每一个request通过中间
件都会调用这个方法。
第三行:随机选择一个User-Agent
第四行:设置request的User-Agent为我们随机的User-Agent
^_^Y(^o^)Y一个中间件写完了!哈哈 是不是So easy!
下面就需要登陆了。这次我们不用上一篇博文的FromRequest来实现登陆了。我们来使用Cookie登陆。这样的话我们需要重写Cookie中间件!分布式爬虫啊!你不能手动的给每个Spider写一个Cookie吧。而且你还不会知道这个Cookie到底有没有失效。所以我们需要维护一个Cookie池(这个cookie池用redis)。
好!来理一理思路,维护一个Cookie池最基本需要具备些什么功能呢?
获取Cookie
更新Cookie
删除Cookie
判断Cookie是否可用进行相对应的操作(比如重试)
好,我们先做前三个对Cookie进行操作。
首先我们在项目中新建一个cookies.py的文件用来写我们需要对Cookie进行的操作。
haoduofuli/haoduofuli/cookies.py:
首先日常导入我们需要的文件:
import requests
import json
import redis
import logging
from .settings import REDIS_URL ##获取settings.py中的REDIS_URL
import requestsimport jsonimport redisimport loggingfrom .settings import REDIS_URL ##获取settings.py中的REDIS_URL
首先我们把登陆用的账号密码 以Key:value的形式存入redis数据库。不推荐使用db0(这是Scrapy-redis默认使用的,账号密码单独使用一个db进行存储。)
就像这个样子。
解决第一个问题:获取Cookie:
import requests
import json
import redis
import logging
from .settings import REDIS_URL
logger = logging.getLogger(__name__)
##使用REDIS_URL链接Redis数据库, deconde_responses=True这个参数必须要,数据会变成byte形式 完全没法用
reds = redis.Redis.from_url(REDIS_URL, db=2, decode_responses=True)
login_url = 'http://haoduofuli.pw/wp-login.php'
##获取Cookie
def get_cookie(account, password):
s = requests.Session()
payload = {
'log': account,
'pwd': password,
'rememberme': "forever",
'wp-submit': "登录",
'redirect_to': "http://http://www.haoduofuli.pw/wp-admin/",
'testcookie': "1"
response = s.post(login_url, data=payload)
cookies = response.cookies.get_dict()
logger.warning("获取Cookie成功!(账号为:%s)" % account)
return json.dumps(cookies)
1234567891011121314151617181920212223242526
import requestsimport jsonimport redisimport loggingfrom .settings import REDIS_URL&logger = logging.getLogger(__name__)##使用REDIS_URL链接Redis数据库, deconde_responses=True这个参数必须要,数据会变成byte形式 完全没法用reds = redis.Redis.from_url(REDIS_URL, db=2, decode_responses=True)login_url = 'http://haoduofuli.pw/wp-login.php'&##获取Cookiedef get_cookie(account, password):&&&&s = requests.Session()&&&&payload = {&&&&&&&&'log': account,&&&&&&&&'pwd': password,&&&&&&&&'rememberme': "forever",&&&&&&&&'wp-submit': "登录",&&&&&&&&'redirect_to': "http://http://www.haoduofuli.pw/wp-admin/",&&&&&&&&'testcookie': "1"&&&&}&&&&response = s.post(login_url, data=payload)&&&&cookies = response.cookies.get_dict()&&&&logger.warning("获取Cookie成功!(账号为:%s)" % account)&&&&return json.dumps(cookies)
这段很好懂吧。
使用requests模块提交表单登陆获得Cookie,返回一个通过Json序列化后的Cookie(如果不序列化,存入Redis后会变成Plain Text格式的,后面取出来Cookie就没法用啦。)
第二个问题:将Cookie写入Redis数据库(分布式呀,当然得要其它其它Spider也能使用这个Cookie了)
def init_cookie(red, spidername):
redkeys = reds.keys()
for user in redkeys:
password = reds.get(user)
if red.get("%s:Cookies:%s--%s" % (spidername, user, password)) is None:
cookie = get_cookie(user, password)
red.set("%s:Cookies:%s--%s"% (spidername, user, password), cookie)
def init_cookie(red, spidername):&&&&redkeys = reds.keys()&&&&for user in redkeys:&&&&&&&&password = reds.get(user)&&&&&&&&if red.get("%s:Cookies:%s--%s" % (spidername, user, password)) is None:&&&&&&&&&&&&cookie = get_cookie(user, password)&&&&&&&&&&&&red.set("%s:Cookies:%s--%s"% (spidername, user, password), cookie)
使用我们上面建立的redis链接获取redis db2中的所有Key(我们设置为账号的哦!),再从redis中获取所有的Value(我设成了密码哦!)
判断这个spider和账号的Cookie是否存在,不存在 则调用get_cookie函数传入从redis中获取到的账号密码的cookie;
保存进redis,Key为spider名字和账号密码,value为cookie。
这儿操作redis的不是上面建立的那个reds链接哦!而是后面会传进来的(因为要操作两个不同的db,我在文档中没有看到切换db的方法,只好这么用了,知道的小伙伴儿留言一下)。
spidername获取方式后面也会说的。
还有剩余的更新Cookie
删除无法使用的账号等,大家伙可以自己试着写写(写不出来也没关系 不影响正常使用)
好啦!搞定!简直So Easy!!!!
转载请注明: &
or分享 (0)
您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击下面的
想结交更多的朋友吗?
来进击的Coder瞧瞧吧
进击的Coder
进击的Coder灌水太多?
这里是纯粹的技术领地
激进的Coder
想找人聊天解闷?想要学习干货?
微信公众号进击的Coder为你打造
进击的Coder
微信公众号
扫一扫关注

我要回帖

更多关于 scrapy retry设置 的文章

 

随机推荐