Python scrapy 设置代理的两种方式(附源码)
上一篇米扑博客"Python scrapy 安装与开发",介绍了Scrapy的安装配置和爬虫使用
本文将详细介绍Scrapy如何配置代理,进行网络爬取采集数据,最后附上源码。
开发环境
Mac OS X Sierra 10.12.3
Python 2.7.13
Scrapy 1.4.0
Python Scrapy 设置代理的两种方式:
方式1: 直接在代码里设置,如 MimvpSpider ——> start_requests
方式2: 通过 middlewares.py + settings.py 配置文件设置
详细步骤:
2.1 middlewares.py 添加代理类 ProxyMiddleware,并添加代理
2.2 settings.py 开启 DOWNLOADER_MIDDLEWARES,并且添加 'mimvp_proxy_python_scrapy.middlewares.ProxyMiddleware': 100,
1. 创建Scrapy项目
本文是米扑代理官方编写的代理使用示例,项目名称为:mimvp_proxy_python_scrapy
项目创建命令:
$ scrapy startproject mimvp_proxy_python_scrapy
2. 查看项目结构
$ tree . |____mimvp_proxy_python_scrapy | |____mimvp_proxy_python_scrapy | | |______init__.py | | |______pycache__ | | |____items.py | | |____middlewares.py | | |____pipelines.py | | |____settings.py | | |____spiders | | | |______init__.py | | | |______pycache__ | |____scrapy.cfg
导入Eclipse,查看创建的目录结构:
目录文件说明:
- spiders 爬虫目录,如:创建文件、编写爬虫规则(代理里设置代理会用到)
- items.py 设置数据存储模板,用于结构化数据,如:Django的Model
- middlewares.py 存放爬取中间函数、爬取处理函数(配置文件设置代理会用到)
- pipelines 数据处理行为,如:一般结构化的数据持久化
- settings.py 配置文件,如:递归的层数、并发数,延迟下载等爬虫相关的配置(配置文件设置代理会用到)
- scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息
注意:一般创建爬虫文件时,以网站域名命名
3. 方式1:直接代码设置代理
直接在自己的爬虫程序里,设置proxy字段配置代理,即在构造Request里加上meta字段
根据爬取的网址协议,选择用 http 或 https 代理,详细代码如下:
vim mimvp_spider.py
import scrapy class MimvpSpider(scrapy.spiders.Spider): name = "mimvp" allowed_domains = ["mimvp.com"] start_urls = [ "http://proxy.mimvp.com/exist.php", "https://proxy.mimvp.com/exist.php", ] ## 代理设置方式1:直接在代理里设置 def start_requests(self): urls = [ "http://proxy.mimvp.com/exist.php", "https://proxy.mimvp.com/exist.php", ] for url in urls: meta_proxy = "" if url.startswith("http://"): meta_proxy = "http://180.96.27.12:88" # http代理 elif url.startswith("https://"): meta_proxy = "http://109.108.87.136:53281" # https代理 yield scrapy.Request(url=url, callback=self.parse, meta={'proxy': meta_proxy}) def parse(self, response): mimvp_url = response.url # 爬取时请求的url body = response.body # 返回网页内容 print("mimvp_url : " + str(mimvp_url)) print("body : " + str(body))
运行命令:
scrapy crawl mimvp --nolog
4. 方式2:配置文件设置代理
配置文件设置代理,需要同时在 middlewares.py + settings.py 两个文件里配置,详细步骤:
a) middlewares.py 文件里,添加代码:
## 代理设置方式2: 通过 middlewares.py + settings.py 配置文件设置 ## mimvp custom by yourself class ProxyMiddleware(object): def process_request(self,request,spider): if request.url.startswith("http://"): request.meta['proxy']="http://180.96.27.12:88" # http代理 elif request.url.startswith("https://"): request.meta['proxy']="http://109.108.87.136:53281" # https代理 # # proxy authentication # proxy_user_pass = "USERNAME:PASSWORD" # encoded_user_pass = base64.encodestring(proxy_user_pass) # request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
b)settings.py 文件里,开启设置 DOWNLOADER_MIDDLEWARES
# Enable or disable downloader middlewares # See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110, 'mimvp_proxy_python_scrapy.middlewares.ProxyMiddleware': 100, }
c) 代码里编写爬虫
vim mimvp_spider.py
import scrapy class MimvpSpider(scrapy.spiders.Spider): name = "mimvp" allowed_domains = ["mimvp.com"] start_urls = [ "http://proxy.mimvp.com/exist.php", "https://proxy.mimvp.com/exist.php", ] def parse(self, response): mimvp_url = response.url # 爬取时请求的url body = response.body # 返回网页内容 print("mimvp_url : " + str(mimvp_url)) print("body : " + str(body))
运行命令:
scrapy crawl mimvp --nolog
附上源码:mimvp_proxy_python_scrapy.zip
可直接运行,代理IP推荐使用米扑代理:https://proxy.mimvp.com
5. 总结
以上两种代理设置方式,都经严格测试并验证成功,测试代理由米扑代理免费提供
直接在代理里设置代理和利用配置文件设置代理,原理都是一样的
1)在请求爬取网页时,都是在 request 里,通过 meta 设置的代理
2)两者都是根据请求爬取的网页类型,如 http 或 https 设置对应的代理
3)两者都支持用户密码代理;两者都是支持 http 和 https 代理,不支持 socks 代理
6. 致谢
本文里采用的代理全部由米扑代理免费赞助,代理可用性很高,感谢!
米扑代理支持 http、https、socks4、socks5等多种协议,覆盖全球120多个国家,中国34个省市
米扑代理官网: https://proxy.mimvp.com
参考推荐:
米扑代理:代理IP价格对比(推荐)
Windows / Linux / MacOS 设置代理上网的方法汇总
Linux / MacOS 设置全局和授权代理上网的图文教程
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2019-09-11 20:56:59
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!