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

作者:Python新世界 时间:2022-09-19 08:20:26 

在调试爬虫的时候,新手都会遇到关于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 文件中的这块区域

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

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

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

以上就已经配置好了一个简单的代理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 可以看到结果输出

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

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

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

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

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

如何配置动态的代理ip

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

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

修改 setting.py 的 DOWNLOADER_MIDDLEWARES 内容


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

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

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

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

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

来源:https://blog.csdn.net/weixin_46089319/article/details/106191053

标签:Scrapy,IP代理,配置,调试
0
投稿

猜你喜欢

  • RichTextBox 显示图片和word的代码

    2023-06-28 18:27:12
  • Python生成随机密码

    2022-04-02 19:21:19
  • 全网最细 Python 格式化输出用法讲解(推荐)

    2021-07-15 12:01:32
  • js 轮播效果实例分享

    2023-07-16 00:42:43
  • keras回调函数的使用

    2022-08-22 11:42:41
  • python中什么是面向对象

    2021-02-19 04:13:08
  • 每个分类取最新的几条的SQL实现代码

    2012-08-21 10:57:18
  • python+opencv图像分割实现分割不规则ROI区域方法汇总

    2021-04-25 01:50:54
  • Pytorch上下采样函数之F.interpolate数组采样操作详解

    2022-01-19 08:13:51
  • 基于Django用户认证系统详解

    2023-04-13 15:35:13
  • 如何在ADSI中查询用户属性?

    2010-06-17 12:53:00
  • 布局篇(1)—If you love css …

    2008-04-16 14:14:00
  • Django基础知识 web框架的本质详解

    2023-03-23 17:38:01
  • ASP编程代码:隐藏图片的真实地址

    2008-10-19 17:14:00
  • Python处理mysql数据库

    2010-12-03 16:23:00
  • asp我对后台安全的一些做法

    2011-09-01 19:22:09
  • 如何利用Matplotlib库绘制动画及保存GIF图片

    2021-06-08 17:15:40
  • 5个css+div导航菜单

    2011-04-29 12:38:00
  • Python3中常用的处理时间和实现定时任务的方法的介绍

    2022-05-13 09:25:25
  • 通过js获取div的background-image属性

    2023-08-23 06:07:23
  • asp之家 网络编程 m.aspxhome.com