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

本文介绍如何在Scrapy中使用无忧代理(www.data5u.com)的爬虫动态代理IP,以及如何设置User-Agent.

动态转发参考https://blog.csdn.net/u010978757/article/details/104521024

一、创建Scrapy工程
scrapy startproject 工程名

二、进入工程目录,根据爬虫模板生成爬虫文件
scrapy genspider -l # 查看可用模板
scrapy genspider -t 模板名 爬虫文件名 允许的域名

三、定义爬取关注的数据(items.py文件)
四、编写爬虫文件
五、设置IP池或用户代理

  1. 在settings.py同级目录下新建一个文件data5u.py(第8步会用到),添加如下代码:
IPPOOL = [ ]
  1. 创建下载中间文件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
  1. 在settings.py中配置下载中间件,代码如下:
# 配置下载中间件的连接信息
DOWNLOADER_MIDDLEWARES = {
   'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware':123,
  'modetest.middlewares.IPPOOlS' : 125    
}
  1. 在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"
]
  1. 创建下载中间文件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)
  1. 在settings.py中配置下载中间件(合并了第三步的代码):
# 配置下载中间件的连接信息
DOWNLOADER_MIDDLEWARES = {
   'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
   'modetest.uamid.Uamid': 1    
}

  1. 整体的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
}

#============================================
  1. 定义一个线程,定时从无忧代理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);
  1. 在您爬虫的启动类(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();

参考链接:http://www.data5u.com/help/article-61.html

Scrapy是一个开源的网络爬虫框架,主要用于爬取网站数据并提取结构化信息。在使用Scrapy进行爬取数据的过程,可能需要使用代理池来应对目标网站的反爬虫策略,例如限制同一IP地址的频繁访问。 在Scrapy使用IP代理池,可以采取以下步骤: 1. **准备代理池**:首先需要有一个代理池服务,可以是一个简单的代理列表,也可以是一个复杂的代理池系统,该系统可以动态地检测代理的可用性,并提供有效代理。 2. **安装第三方库**:在Scrapy项目,可能需要安装一些第三方库,比如`scrapy-proxies`,帮助Scrapy随机使用代理。 3. **配置代理使用**:在Scrapy的`settings.py`配置文件,可以配置代理使用。例如,可以通过间件来设置请求使用代理Scrapy默认有一个代理间件`HttpProxyMiddleware`,可以用来设置请求的代理。 4. **动态代理选择**:如果是基于代理池的动态代理选择,你可能需要自定义一个间件来实现从代理获取代理,并设置到每个请求。 以下是一个简化的配置示例: ```python # settings.py HTTP_PROXY = 'http://代理IP:端口' # 或者自定义间件,通过代理池动态获取代理 class ProxyMiddleware(object): def process_request(self, request, spider): proxy = get_proxy_from_pool() # 从代理获取一个代理 if proxy: request.meta['proxy'] = proxy ``` 在实际使用,需要确保代理池服务的稳定性和代理的可用性,并且要合理设置代理的轮换策略,以避免触发目标网站的异常检测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DATA5U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值