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
文件中的这块区域
修改如下,也就是取消注释,加上刚刚写的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 设置是否成功。
来源:https://blog.csdn.net/weixin_46089319/article/details/106191053


猜你喜欢
- 又是一年春来到,看各大网站的新年Logo也成为了我们必不可少的新年餐点,为此,我们特别整理了部分网站的新年Logo秀,如果你看到了更加有意思
- 数据结构数据结构的概念很好理解,就是用来将数据组织在一起的结构。换句话说,数据结构是用来存储一系列关联数据的东西。在Python中有四种内建
- 我的机器不知为何,安装MySQL的时候,一到配置那一步就无休止的等待,只好结束任务,然而启动MySQL的时候出现1067错误提示
- 这几天不是很忙,就找了些拖动布局方面的资料看看,也学着写了个拖动布局的效果,没想到花了好多时间,七拼八凑,总算是把这个效果写出来了。哎!还是
- 本文主要介绍了Python3.9.0a1安装pygame出错解决全过程,分享给大家,具体如下:解决方法先说一下经验教训:pygame最后终于
- 动机一些bug由于本地环境和线上环境的不一致可能导致本地无法复现本地依赖和线上依赖版本不一致也可以导致一些问题有时一些bug跟数据相关,本地
- 我们可以调用matplotlib 绘制我们的柱状图,柱状图可以是水平的也可以是竖直的。在这里我先记录下竖直的柱状图怎么绘制在这里一般用到的函
- Oracle text是Oracle的全文检索技术,是9i版本标准版和企业版的一部分。Oracle text使用标准的sql语言索引、查找、
- 本文实例讲述了Django rest framework工具包简单用法。分享给大家供大家参考,具体如下:Django rest framew
- 每天面对成堆的发票,无论是发票还是承兑单据,抑或是其他各类公司数据要从照片、PDF等不同格式的内容中提取,我们都有必要进行快速办公的能力提升
- 首先,我当时出现的问题是newproject创建的时候没有django的选项,查了半天发现我安装的pycharm是社区版本。所以需要用终端命
- 什么是命令行交互当我们使用脚手架去创建一个项目的时候,通常会通过命令行交互来获取一些信息:比如填项目名称;选择项目模板;选择版本;需要安装哪
- 目录1、sysbench介绍#项目下载地址:2、sysbench安装过程#安装相关依赖#安装过程开始#提示说明:#常规命令行选项#sysbe
- function nohtml(str) dim re Set re=new 
- 前言因为是国企线上应用的活动大屏,我就不附图了。代码仅供参考。一、vue配置1. 我是用vue-cli 搭建的,大屏项目复杂度不高,vue-
- 背景Translation插件在mac上idea能够搜索到,但是在windows上却搜索不到解决勾选上成功了。来源:https://blog
- 最近写了个python抓取必应搜索首页http://cn.bing.com/的背景图片并将此图片更换为我的电脑桌面的程序,在正则匹配图片ur
- NMS 算法在目标检测,目标定位领域有较广泛的应用。算法原理非极大值抑制算法(Non-maximum suppression, NMS)的本
- 最近一直在做Dnn模块的开发,过程中碰到这么一个问题,需要同时插入N条数据,不想在程序里控制,但是SQL Sever又不支持数组参数.所以只
- 前言深度学习框架在市面上有很多。比如Theano、Caffe、CNTK、MXnet 、Tensorflow等。今天讲解的就是主角Tensor