在调试爬虫的时候,新手都会遇到关于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 Middlewaredef process_request(self, request, spider):# 随机从其中选择一个,并去除左右两边空格proxy = random.choice(self.proxyList).strip()# 打印结果出来观察print("this is request ip:" + proxy)# 设置request的proxy属性的内容为代理iprequest.meta['proxy'] = proxy# Downloader Middleware的核心方法,只有实现了其中一个或多个方法才算自定义了一个Downloader Middlewaredef process_response(self, request, response, spider):# 请求失败不等于200if response.status != 200:# 重新选择一个代理ipproxy = random.choice(self.proxyList).strip()print("this is response ip:" + proxy)# 设置新的代理ip内容request.mete['proxy'] = proxyreturn requestreturn 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 scrapyclass 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 executeclass HttpproxyipSpider(scrapy.Spider):# spider 任务名name = 'httpProxyIp'# 允许访问的域名allowed_domains = ['icanhazip.com']# 起始爬取的urlstart_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代理的配置与调试相关推荐

  1. python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取

    python爬虫–Scrapy框架–Scrapy+selenium实现动态爬取 前言 本文基于数据分析竞赛爬虫阶段,对使用scrapy + selenium进行政策文本爬虫进行记录.用于个人爬虫学习记 ...

  2. Python爬虫—Scrapy框架—Win10下载安装

    Python爬虫-Scrapy框架-Win10下载安装 1. 下载wheel 2.下载twisted 3. 下载pywin32 4. 下载安装Scrapy 5. 创建一个scrapy项目 6. fir ...

  3. Python爬虫 scrapy框架爬取某招聘网存入mongodb解析

    这篇文章主要介绍了Python爬虫 scrapy框架爬取某招聘网存入mongodb解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 创建项目 sc ...

  4. Python爬虫-Scrapy框架(四)- 内置爬虫文件 - 4.2 初探Crawl Spider

    Python爬虫-Scrapy框架(四)- 内置爬虫文件 - 4.2 初探Crawl Spider 写在前面 初探Crawl Spider 创建Crawl Spider项目 对比Basic与Crawl ...

  5. Python中Scrapy框架的代理使用

    本文的那个网站皆用GG所代替,请审核高抬贵手. scrapy框架,熟悉python爬虫的朋友们应该知道甚至有所了解,scrapy是一个爬虫框架,模块化程度高,可拓展性强,对相应的模块进行开发和拓展就能 ...

  6. python爬虫之:IP代理池开源项目讲解

    Table of Contents 一.项目基本介绍 二.项目讲解 三.一些项目问题答疑 四.代理池设计 一.项目基本介绍 本项目来源于github,截止于2019/08/20,star数量:7133 ...

  7. Python爬虫——Scrapy框架

    Scrapy是用python实现的一个为了爬取网站数据,提取结构性数据而编写的应用框架.使用Twisted高效异步网络框架来处理网络通信. Scrapy架构: ScrapyEngine:引擎.负责控制 ...

  8. Python爬虫scrapy框架的源代码分析

    scrapy框架流程图 推荐三个网址:官方1.5版本:https://doc.scrapy.org/en/latest/topics/architecture.html点击打开链接 官方0.24版本( ...

  9. python爬虫--scrapy框架的学习和使用(七)⭐---第二部分

    文章目录 九.CrawlSpider⭐⭐⭐ 实战项目 问题总结 十.分布式爬虫 十一.增量式爬虫 总结 九.CrawlSpider⭐⭐⭐ 是一个类,基于Spider的子类. 子类继承父类所有的功能,并 ...

最新文章

  1. iOS中得block代码块的定义及使用
  2. 转载 jsonrpc环境搭建和简单实例
  3. eclipse工程设置项目jre
  4. [Swift]LeetCode873. 最长的斐波那契子序列的长度 | Length of Longest Fibonacci Subsequence...
  5. 微服务架构如何保障双11狂欢下的99.99%高可用
  6. 设计模式之“适配器模式”
  7. 62个电脑常用快捷键大全,一次分享,果断收藏!
  8. matlab meshc函数_有那些相见恨晚的MATLAB绘图命令
  9. 首款“印度制造”的微处理器 AJIT 面世!
  10. vue watch 修改滚动条_vue 中滚动条始终定位在底部的方法
  11. JAVAWeb项目 微型商城项目-------(五)用户登录实现
  12. apache 的batik生成svg文件和通过swing界面查看效果
  13. 马士兵servletjsp视频教程——第二部分jsp笔记及源代码、servlet和jsp的通信
  14. Delphi系列书籍118本
  15. 图片合成雾的方法概述
  16. bitwise ssh client的使用
  17. openstack云计算平台 2(计算服务、Networking 服务、命令行方式启动实例)
  18. 【Java获取国家法定节假日三种工具类其一】
  19. python毕业设计项目源码选题(4)企业公司网站系统毕业设计毕设作品开题报告开题答辩PPT
  20. 如何在手机浏览器中打开安卓APP

热门文章

  1. python-格化输出format方法
  2. python-数据类型-整数类型与浮点数据类型
  3. Ubuntu更换apt镜像源
  4. 利用burp实现弱密码破解
  5. Oracle数据库重启后密码失效的问题(r12笔记第91天)
  6. 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow
  7. HDU1253 胜利大逃亡
  8. Hotspot JVM的常用选项
  9. Chrome开发者工具之JavaScript内存分析
  10. Oracle corrupt block(坏块) 详解