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

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

代理ip的逻辑在哪里

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

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

从上图能够发现,代理ip的设置确定是在发送请求以前就要设置好,那么惟一符合条件的地方就是 middlewares.py ,因此关于代理的相关逻辑都写在这个里面。直接在其中添加以下代码:nginx

# 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 类的路径dom

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

# -*- 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 复制代码

咱们修改一下,最终代码以下所示:ide

# -*- 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 设置是否成功。

相关文章
相关标签/搜索