在学习爬虫的过程中遇到了这个问题:使用scrapy在爬取数据时怎么使用代理IP?于是去搜索相关资料,最后用这位大神的方法解决了问题:Python scrapy设置代理ip_python的scrapy框架测试用api链接取的ip-CSDN博客
不过最后也是总结以下大佬的方法,发现了更简便的方法
一.设置代理池
我们找到settings.py文件,并在其中创建数组类型的变量PROXIES_LIST,其内容就是候选的代理(建议变量名就用PROXIES_LIST)
PROXIES_LIST = [
'http://120.83.106.228:9999',
'https://223.241.78.23:808'
]# 当你看到文章时这些代理可能已经失效
二.在中间件middlewares.py中使用代理
什么是中间件可以去看参考链接,他介绍的比较简明,这里我就不赘述了
首先先导入settings中我们定义的代理池(导入后编译器可能会报错,是因为导入的是本地文件,并非官方库,但不影响运行)
from scrapy_37_proxy.settings import PROXIES_LIST
# scrapy_37_proxy是我的项目名,你需要换成你的项目名
注意:就是这里与参考链接不同,他是自己写了一个类,类中定义了一个方法选择代理IP,然后再settings文件中写一个开关加载这个类;而我发现在中间件中本身就有这个方法,我们不用重写这个方法了,直接改就行
此方法在middlewares中第二个类中,方法中自带的return None我们删掉,然后写自己的代码,即从代理池中随机挑选一个代理(需要导入random)
import random
def process_request(self, request, spider):
# Called for each request that goes through the downloader
# middleware.
# Must either:
# - return None: continue processing this request
# - or return a Response object
# - or return a Request object
# - or raise IgnoreRequest: process_exception() methods of
# installed downloader middleware will be called
# return None
request.meta['proxy'] = random.choice(PROXIES_LIST)
三.在settings.py中打开开关
所谓开关起始就是控制我们刚写的代码是否执行的代码,注释掉就是关,不注释就是开
开关就是这行代码
DOWNLOADER_MIDDLEWARES = {
"scrapy_37_proxy.middlewares.Scrapy37ProxyDownloaderMiddleware": 543,
}# 默认是关闭状态,即此代码默认是被注释掉的,我们给他打开
运行即可,这样的话我们也不用再自己写一个开关了
我测试IP是否发生改变用的网址是这个,非常简洁且有效互连协议查询 - IP查询 - 查IP(www.cip.cc)