 
                				
                				
                				  
   本文介绍如何在Scrapy中使用无忧代理家的爬虫动态代理IP,以及如何设置User-Agent.
  
  
    
     
    
一、创建Scrapy工程
  
  
   二、进入工程目录,根据爬虫模板生成爬虫文件
  
  
   
    - scrapy genspider -l # 查看可用模板
 
- scrapy genspider -t 模板名 爬虫文件名 允许的域名
 
  
   三、定义爬取关注的数据(items.py文件)
  
  
   四、编写爬虫文件
  
  
   五、设置IP池或用户代理
  
  
   
  
  
   1. 在settings.py同级目录下新建一个文件data5u.py(第8步会用到),添加如下代码:
  
   
    
   
   
    IPPOOL = [ ]
   
   
    
   
   
    2. 创建下载中间文件middlewares.py(与settings.py同一个目录),代码如下:
   
    
   
   
    
     # -*- coding: UTF-8 -*-
    
    
     '''
    
    
     Python 3.x
    
    
     无忧代理IP Created on 2018年07月11日
    
    
     描述:本段代码是Scrapy的代理中间件,用于设置代理IP
    
    
     @author: www.data5u.com
    
    
     '''
    
    
   
    # 导入随机模块
   
   
    import random
   
   
    # 导入data5u文件中的IPPOOL
   
   
    from data5u import IPPOOL
   
   
    # 导入官方文档对应的HttpProxyMiddleware
   
   
    from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware
   
   
    
   
   
    class IPPOOlS(HttpProxyMiddleware):
   
   
      # 初始化
   
   
      def __init__(self, ip=''):
   
   
      self.ip = ip
   
   
    
   
   
      # 请求处理
   
   
      def process_request(self, request, spider):
   
   
      # 先随机选择一个IP
   
   
      thisip = random.choice(IPPOOL)
   
   
      print("当前使用IP是:"+ thisip)
   
   
      request.meta["proxy"] = "http://"+thisip
   
  
   
  
  
   3. 在settings.py中配置下载中间件,代码如下:
  
  
   
  
  
   
    # 配置下载中间件的连接信息
   
   
    DOWNLOADER_MIDDLEWARES = {
   
   
       'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware':123,
   
   
      'modetest.middlewares.IPPOOlS' : 125    
   
   
    }
   
   
  
   
  
  
   4. 在settings.py文件中添加用户UserAgent的信息,如:
  
  
   
  
  
   
    # 设置用户代理池
   
   
    UAPOOL= [
   
   	"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0", 
	"Mozilla/5.0 (Windows NT 10.0; Win64; x64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36", 
	"Mozilla/5.0 (Windows NT 10.0; Win64; x64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
   
   
    ]
   
   
  
   
  
  
   5. 创建下载中间文件uamid.py(与settings.py同一个目录),代码为:
  
  
   
   
    
     # -*- coding: UTF-8 -*-
    
    
     '''
    
    
     Python 3.x
    
    
     无忧代理IP Created on 2018年07月11日
    
    
     描述:本段代码是Scrapy的下载中间件,用于模拟UserAgent
    
    
     @author: www.data5u.com
    
    
     '''
    
    
   
    # 导入随机模块
   
   
    import random
   
   
    # 导入settings文件中的UAPOOL
   
   
    from settings import UAPOOL
   
   
    # 导入官方文档对应的HttpProxyMiddleware
   
   
    from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware
   
   
    
   
   
    class Uamid(UserAgentMiddleware):
   
   
      # 初始化 注意一定要user_agent,不然容易报错   
   
   
      def __init__(self, user_agent=''):
   
   
      self.user_agent = user_agent
   
   
    
   
   
      # 请求处理
   
   
      def process_request(self, request, spider):
   
   
        # 先随机选择一个用户代理
   
   
        thisua = random.choice(UAPOOL)
   
   
        print("当前使用User-Agent是:"+thisua)
   
   
        request.headers.setdefault('User-Agent',thisua)
   
  
   
  
  
   6. 在settings.py中配置下载中间件(合并了第三步的代码):
  
  
   
    
   
   
    # 配置下载中间件的连接信息
   
   
    DOWNLOADER_MIDDLEWARES = {
   
   
       'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
   
   
       'modetest.uamid.Uamid': 1    
   
   
    }
   
   
  
   
  
  
   7. 整体的settings.py代码如下:
  
  
   
  
  
   
    # -*- coding: UTF-8 -*-
   
   
    '''
   
   
    Python 3.x
   
   
    无忧代理IP Created on 2018年07月11日
   
   
    描述:本段代码是Scrapy的配置信息
   
   
    @author: www.data5u.com
   
   
    '''
   
   
  
   
  
  
   
    #========================================
   
   
    
   
   
    # 设置IP池和用户UserAgent
   
   
    
   
   
    #  禁止本地Cookie
   
   
    COOKIES_ENABLED = False
   
   
   
   
    # 设置用户代理池
   
   
    UAPOOL = [
   
   	"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0", 
	"Mozilla/5.0 (Windows NT 10.0; Win64; x64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36", 
	"Mozilla/5.0 (Windows NT 10.0; Win64; x64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
   
   
    ]
   
   
    
   
   
    # 配置下载中间件的连接信息
   
   
    DOWNLOADER_MIDDLEWARES = {
   
   
        'scrapy.contrib.downloadermiddlewares.httpproxy.HttpProxyMiddleware':123,
   
   
        'modetest.middlewares.IPPOOlS' : 125,
   
   
        'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
   
   
        'modetest.uamid.Uamid': 1
   
   
    }
   
   
    
   
   
    #============================================
   
   
  
   
  
  
   8. 定义一个线程,定时从无忧代理API接口中获取IP,存入data5u.py中的IPPOOL变量中,代码如下:
  
  
   
  
  
   
    # -*- coding: UTF-8 -*-
   
   
    '''
   
   
    Python 3.x
   
   
    无忧代理IP Created on 2018年07月11日
   
   
    描述:本段代码定时从无忧代理API接口获取代理IP,存入IP池中
   
   
    @author: www.data5u.com
   
   
    '''
   
   
    import requests;
   
   
    import time;
   
   
    import threading;
   
   
    from data5u import IPPOOL;
   
   
    from requests.packages import urllib3;
   
   
    
   
   # 获取代理IP的线程类
   
    class GetIpThread(threading.Thread):
   
   
        def __init__(self,apiUrl, fetchSecond):
   
   
            super(GetIpThread, self).__init__();
   
           self.fetchSecond=fetchSecond;
        self.apiUrl=apiUrl;
    def run(self):
           while True:
   
                # 获取IP列表
   
   
                res = requests.get(self.apiUrl).content.decode()
   
                # 按照\n分割获取到的IP
   
   
                IPPOOL = res.split('\n');
   
   
                # 休眠
   
   
                time.sleep(self.fetchSecond);
   
   
    9. 在您爬虫的启动类(if __name__ == '__main__':)里面添加如下代码定时获取代理IP:
   
        # 这里填写无忧代理IP提供的API订单号(请到用户中心获取)
   
   
        order = "请把这里替换为您的IP提取码";
   
   
        # 获取IP的API接口
   
   
        apiUrl = "http://api.ip.data5u.com/dynamic/get.html?order=" + order;
   
   
        # 获取IP时间间隔,建议为5秒
   
   
        fetchSecond = 5;
   
   
        # 开始自动获取IP
   
   
        GetIpThread(apiUrl, fetchSecond).start();
   
  
   
  
  
   ------------------------文章到此结束-----------------------------
                				
                				
                					福利:现在通过开发者购买代理IP,购买后联系客服最高可获  
                					返现20%
                					 
                					到你的支付宝(最低35元,最高1440元)
                				
                				
                				
                    					无忧代理IP(www.data5u.com)原创文章,转载请注明出处。