上一篇米扑博客"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,查看创建的目录结构:

python-scrapy-an-zhuang-yu-kai-fa-02

目录文件说明:

  • 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推荐使用米扑代理:http://proxy.mimvp.com

 

5. 总结

以上两种代理设置方式,都经严格测试并验证成功,测试代理由米扑代理免费提供

直接在代理里设置代理和利用配置文件设置代理,原理都是一样的

1)在请求爬取网页时,都是在 request 里,通过 meta 设置的代理

2)两者都是根据请求爬取的网页类型,如 http 或 https 设置对应的代理

3)两者都支持用户密码代理;两者都是支持 http 和 https 代理,不支持 socks 代理

 

6. 致谢

本文里采用的代理全部由米扑代理免费赞助,代理可用性很高,感谢!

米扑代理支持 http、https、socks4、socks5等多种协议,覆盖全球120多个国家,中国34个省市

米扑代理官网: http://proxy.mimvp.com

 

 

参考推荐:

Python scrapy 安装与开发

Python requests 安装与开发

Python pyspider 安装与开发

Python3 urllib 用法详解