Python爬虫Scrapy框架IP代理的配置与调试

 更新时间:2021年12月27日 10:45:51   作者:Python新世界  
在调试爬虫的时候,新手都会遇到关于ip的错误,本文就来介绍一下Python爬虫Scrapy框架IP代理的配置与调试,具有一定的参考价值,感兴趣的可以了解一下

在调试爬虫的时候,新手都会遇到关于ip的错误,好好的程序突然报错了,怎么解决,关于ip访问的错误其实很好解决,但是怎么知道解决好了呢?怎么确定是代理ip的问题呢?由于笔者主修语言是Java,所以有些解释可能和Python大佬们的解释不一样,因为我是从Java 的角度看Python。这样也便于Java开发人员阅读理解。

代理ip的逻辑在哪里

一个scrapy 的项目结构是这样的

scrapydownloadertest  # 项目文件夹
    │  items.py       # 定义爬取结果存储的数据结构
    │  middlewares.py  # 中间件(可以理解java的过滤器拦截器)
    │  pipelines.py   # 数据管道,对获取到的数据做操作
    │  settings.py   # 项目的配置文件
    │  __init__.py   # 初始化逻辑
    │
    ├─spiders  # 放置 Spiders 的文件夹
    │  │  httpProxyIp.py   # 爬取到结果后的处理类
    │  │  __init__.py    # spider初始化逻辑
scrapy.py  

从上可以发现,代理ip的设置肯定是在发送请求之前就要设置好,那么唯一符合条件的地方就是 middlewares.py ,所以关于代理的相关逻辑都写在这个里面。直接在其中添加如下代码:

# Scrapy 内置的 Downloader Middleware 为 Scrapy 供了基础的功能,
# 定义一个类,其中(object)可以不写,效果一样
class SimpleProxyMiddleware(object):
    # 声明一个数组
    proxyList = ['http://218.75.158.153:3128','http://188.226.141.61:8080']
    
    # Downloader Middleware的核心方法,只有实现了其中一个或多个方法才算自定义了一个Downloader Middleware
    def process_request(self, request, spider):
        # 随机从其中选择一个,并去除左右两边空格
        proxy = random.choice(self.proxyList).strip()
        # 打印结果出来观察
        print("this is request ip:" + proxy)
        # 设置request的proxy属性的内容为代理ip
        request.meta['proxy'] = proxy

    # Downloader Middleware的核心方法,只有实现了其中一个或多个方法才算自定义了一个Downloader Middleware
    def process_response(self, request, response, spider):
        # 请求失败不等于200
        if response.status != 200:
            # 重新选择一个代理ip
            proxy = random.choice(self.proxyList).strip()
            print("this is response ip:" + proxy)
            # 设置新的代理ip内容
            request.mete['proxy'] = proxy
            return request
        return response

每个 Downloader Middleware 定义了一个或多个方法的类,核心的方法有如下三个:

  • process_request(request, spider)
  • process_response(request,response, spider)
  • process_exception(request, exception, spider)

然后找到 setting.py 文件中的这块区域

修改如下,也就是取消注释,加上刚刚写的Middleware 类的路径

以上就已经配置好了一个简单的代理ip,此时来到 httpProxyIp.py 这个文件, 这个文件是我通过命令 scrapy genspider httpProxyIp icanhazip.com 生成的,创建成功内容如下:

# -*- coding: utf-8 -*-
import scrapy

class HttpproxyipSpider(scrapy.Spider):
    name = 'httpProxyIp'
    allowed_domains = ['icanhazip.com']
    start_urls = ['http://icanhazip.com/']

    def parse(self, response):
        pass

我们修改一下,最终代码如下所示:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.cmdline import execute

class HttpproxyipSpider(scrapy.Spider):
    # spider 任务名
    name = 'httpProxyIp'
    # 允许访问的域名
    allowed_domains = ['icanhazip.com']
    # 起始爬取的url
    start_urls = ['http://icanhazip.com/']

    # spider 爬虫解析的方法,关于内容的解析都在这里完成; self表示实例的引用, response爬虫的结果
    def parse(self, response):
        print('代理后的ip: ', response.text)

# 这个是main函数也是整个程序入口的惯用写法
if __name__ == '__main__':
    execute(['scrapy', 'crawl', 'httpbin'])

此时运行程序 scrapy crawl httpProxyIp 可以看到结果输出

很明显,这里没有打印出我们想要的结果,说明之前 proxyList = ['http://218.75.158.153:3128','http://188.226.141.61:8080'] 没有用,我们找找有没有可以用的,这里用免费的,所以找起来费点时间 免费代理ip

这样就完成了scrapy的代理设置和验证调试。

如何配置动态的代理ip

这里使用的是收费的代理ip了,你可以使用快代理或者阿布云等云服务商提供的服务,当你注册并缴费之后,会给你一个访问url和用户名密码,这里直接看代码吧! 同样在 middlewares.py新建一个类

修改 setting.py 的 DOWNLOADER_MIDDLEWARES 内容

DOWNLOADER_MIDDLEWARES = {
    # 注释掉之前的例子改用AbuyunProxyMiddleware
    # 'scrapydownloadertest.middlewares.SimpleProxyMiddleware': 100,
    'scrapydownloadertest.middlewares.AbuyunProxyMiddleware': 100,
}

其他地方不动,我们在启动看看,这里换种启动方式,因为使用的是PyCharm开发工具,所以可以直接

http://icanhazip.com/是一个显示当前访问者ip的网站,可以很方便的用来验证scrapy的代理ip 设置是否成功。

到此这篇关于Python爬虫Scrapy框架IP代理的配置与调试的文章就介绍到这了,更多相关Scrapy框架IP代理配置调试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Django后端接收嵌套Json数据及解析详解

    Django后端接收嵌套Json数据及解析详解

    这篇文章主要介绍了Django后端接收嵌套Json数据及解析详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python实现简单过滤文本段的方法

    Python实现简单过滤文本段的方法

    这篇文章主要介绍了Python实现简单过滤文本段的方法,涉及Python针对文本的读取及字符串遍历、判断、打印等相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • Python数据分析之绘制ppi-cpi剪刀差图形

    Python数据分析之绘制ppi-cpi剪刀差图形

    这篇文章主要介绍了Python数据分析之绘制ppi-cpi剪刀差图形,ppi-cp剪刀差是通过这个指标可以了解当前的经济运行状况,下文更多详细内容介绍需要的小伙伴可以参考一下
    2022-05-05
  • 基于pytorch实现运动鞋品牌识别功能

    基于pytorch实现运动鞋品牌识别功能

    这篇文章主要给大家介绍了关于如何基于pytorch实现运动鞋品牌识别功能,文中通过图文以及实例代码介绍的非常详细,对大家学习或者使用PyTorch具有一定的参考学习价值,需要的朋友可以参考下
    2024-02-02
  • Python解析多帧dicom数据详解

    Python解析多帧dicom数据详解

    今天小编就为大家分享一篇Python解析多帧dicom数据详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • PyTorch中torch.utils.data.DataLoader实例详解

    PyTorch中torch.utils.data.DataLoader实例详解

    torch.utils.data.DataLoader主要是对数据进行batch的划分,下面这篇文章主要给大家介绍了关于PyTorch中torch.utils.data.DataLoader的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • matlab调用python的各种方法举例子详解

    matlab调用python的各种方法举例子详解

    为了发挥matlab的绘图优势+原先python写好的功能组合方式,下面这篇文章主要给大家介绍了关于matlab调用python的各种方法,需要的朋友可以参考下
    2023-09-09
  • Python的MongoDB模块PyMongo操作方法集锦

    Python的MongoDB模块PyMongo操作方法集锦

    这篇文章主要介绍了Python的MongoDB模块PyMongo操作方法集锦,包括数据的增删查改以及索引等相关的基本操作,需要的朋友可以参考下
    2016-01-01
  • Keras使用ImageNet上预训练的模型方式

    Keras使用ImageNet上预训练的模型方式

    这篇文章主要介绍了Keras使用ImageNet上预训练的模型方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法

    python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法

    字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,本文讲述了python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
    2018-09-09

最新评论