12.3 设置随机用户代理和 IP 代理
上节介绍了下载器中间件,这节介绍如何通过下载器中间设置随机用户代理和 IP 代理。
12.3.1 设置随机用户代理

应对反爬虫-使用用户代理
既然要设置随机 User Agent,首先要准备一批可用的 User Agent(可以从网上搜索一批),为了便于统一更改设置,将这些 User Agent 以列表的形式添加到项目的 settings.py 文件中。
USER_AGENTS = [
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN)
AppleWebKit/523.15 (KHTML, like Gecko,
Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US)
AppleWebKit/527+(KHTML, like Gecko, Safari/419.3)
Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9)
Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US;
rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10
Kazehakase/0.5.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/535.11 (KHTML, like Gecko)
Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3)
AppleWebKit/535.20 (KHTML, like Gecko)
Chrome/19.0.1036.7 Safari/535.20",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8;
U; fr) Presto/2.9.168 Version/11.52",
] 这里只是简单演示,用户可以搜索更多的 User Agent 添加进来。
下面编写中间件。在房天下爬虫项目中找到 middlewares.py 文件,在这个文件中编写随机变换 User Agent 中间件。
进入项目的 middlewares.py 文件,可以看到这里面有一个默认生成的 Pachong3SpiderMiddleware 中间件类,不用管它。引入 UserAgentMiddleware 中间件,自定义的随机更换 User Agent 中间件就是在这个中间件基础上,重写 processrequest 方法得到的。在重写的 process-request 方法中使用 random.choise 从前面定义的用户代理列表中随机选取一个 User Agent 来使用。
导入需要的包,把定义的 USER_AGENTS 列表从 settings.py 文件中引入进来。
import random from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware from pachong3.settings import USER_AGENTS
下面开始定义随机 User Agent 类。这里最关键的步骤就是重写 process-request 这个方法,通过这个方法随机地设置了 request 中 headers 的 User Agent。
class RandomUserAgent(UserAgentMiddleware):
def process_request(self, request, spider):
ua = random.choice(USER_AGENTS)
request.headers.setdefault('User-Agent', ua)保存定义好的 middlewares.py 文件,然后在 settings.py 文件中关闭 Scrapy 默认的 User Agent 中间件并启用自己定义的中间件,这样就完成了所有的配置。
DOWNLOADER_MIDDLEWARES = {
'pachong3.middlewares.RandomUserAgent': 543,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
} 启用自定义中间件的写法为“pachong3.middlewares.RandomUserAgent': 543”,前面部分就是我们定义的类的路径,也就是在 pachong3 文件夹下面的 middlewares.py 模块中的 RandomUserAgent 这个类,因此我们的写法是使用点连接起来组成一个路径字符串,作为字典的 key;后面的值是中间件的执行顺序,必须是 0~1000 的整数值。
12.3.2 设置随机 IP 代理

应对反爬虫-使用代理 IP
设置随机变换的 IP 代理可以说是应对反爬虫的利器,尤其对大型爬取任务,设置随机变换的 IP 代理能起到比较好的反爬虫作用。但是免费而又稳定的代理 IP 很少,大部分免费代理 IP 极其不可靠,很可能短时间内不能用了。在处理大型爬虫时,最好购买商业的代理 IP,相对可靠,能减少维护爬虫的工作量。
现在设置随机 IP 代理。还是从西刺代理上选取几个代理 IP 作为例子,在读者看到这里的时候,如果这几个 IP 估计不能用了,可以重新找几个做练习。
第一步,在 settings.py 中写入代理 IP 列表。列表中的元素是字典形式,其 value 就是我们找到的代理 IP。
IPPOOL = [
{'ipaddr':'http://39.69.15.245:53281'},
{'ipaddr':'http://219.138.58.243:3128'}
] 第二步,进入项目的 middlewares.py 文件,编写随机更换代理 IP 的类。
首先导入 settings 中的代理 IP 列表和 HttpProxyMiddleware 类。
from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware from pachong3.settings import IPPOOL
然后定义我们自己的更换代理 IP 类。
class MyproxiesSpiderMiddleware(HttpProxyMiddleware):
def process_request(self, request, spider):
thisip = random.choice(IPPOOL)
request.meta["proxy"] = thisip["ipaddr"] 第三步,在 settings 中启用我们定义的类并关闭 Scrapy 内置的 HttpProxy Middleware。
DOWNLOADER_MIDDLEWARES = {
'pachong3.middlewares.MyproxiesSpiderMiddleware': 100,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,
} 这样就完成了设置随机 IP 代理。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论