[ 登录 ] - [ 注册 ] | 免费代理IP 数据无忧_无忧代理IP_DATA5U最新上线 | 代码示例DEMO | IP测试视频 | 用户协议

在Scrapy中使用爬虫动态代理IP(Python3)

作者:数据无忧   时间:2020-09-18 13:24:53
无忧代理IP推广返现活动
本文介绍如何在Scrapy中使用无忧代理家的爬虫动态代理IP,以及如何设置User-Agent.

一、创建Scrapy工程
  • scrapy startproject 工程名
二、进入工程目录,根据爬虫模板生成爬虫文件
  • 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)原创文章,转载请注明出处。

微信公众号
关注微信公众号