scrapy之ip池
来源:互联网 发布:成都靠谱的linux学校 编辑:程序博客网 时间:2024/06/08 06:04
反爬策略有很多,最常用的也就是ip池,下面让我们一起跟着小省开始ip池之旅吧
直接上代码:
由于我们的ip池是自己维护在数据库中的,所以会有查库这一说
#!/usr/bin/env python# -*- coding: utf-8 -*-# Create by shengjk1 on 2017/11/6from screptile import poolfrom utilspider.dp_util import closefrom twisted.web._newclient import ResponseNeverReceivedfrom twisted.internet.error import TimeoutError, ConnectionRefusedError, ConnectErrorfrom utilspider.util_spider import get_loggerfrom screptile import db_tablelogger = get_logger('flower')class HttpProxyMiddleware(object): DONT_RETRY_ERRORS = (TimeoutError, ConnectionRefusedError, ResponseNeverReceived, ConnectError, ValueError) def process_request(self, request, spider): ip = self.get_ip() request.meta['proxy'] = ip logger.info( 'process_request %s ' % ip) def process_response(self, request,response, spider): if response.status!=200: ip = self.get_ip() request.meta['proxy'] = ip logger.info('process_response %s ' % ip) return request else: return response def process_exception(self, request, exception, spider): if isinstance(exception, self.DONT_RETRY_ERRORS): ip = self.get_ip() request.meta['proxy'] = ip logger.info( 'process_exception %s ' % ip) return request def get_ip(self): conn = pool.connection() cur = conn.cursor() sql = 'SELECT * FROM '+db_table+' where sign=1 ORDER BY RAND() LIMIT 1' cur.execute(sql) result = cur.fetchall() ip = result[0][1] close(cur,conn) return ip
setting.py
DOWNLOADER_MIDDLEWARES = {'screptile.proxip_middleware.HttpProxyMiddleware':543}
setting.py中可以设置超时时间
DOWNLOAD_TIMEOUT=10
备注:
process_request(request, spider)
当每个request通过下载中间件时,该方法被调用。
process_request() 必须返回其中之一: 返回 None 、返回一个 Response 对象、返回一个 Request 对象或raise IgnoreRequest 。
如果其返回 None ,Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该request被执行(其response被下载)。
如果其返回 Response 对象,Scrapy将不会调用 任何 其他的 process_request() 或 process_exception() 方法,或相应地下载函数; 其将返回该response。 已安装的中间件的 process_response() 方法则会在每个response返回时被调用。
如果其返回 Request 对象,Scrapy则停止调用 process_request方法并重新调度返回的request。当新返回的request被执行后, 相应地中间件链将会根据下载的response被调用。
如果其raise一个 IgnoreRequest 异常,则安装的下载中间件的 process_exception() 方法会被调用。如果没有任何一个方法处理该异常, 则request的errback(Request.errback)方法会被调用。如果没有代码处理抛出的异常, 则该异常被忽略且不记录(不同于其他异常那样)。
参数:
request (Request 对象) – 处理的request
spider (Spider 对象) – 该request对应的spider
process_response(request, response, spider)
process_request() 必须返回以下之一: 返回一个 Response 对象、 返回一个 Request 对象或raise一个 IgnoreRequest 异常。
如果其返回一个 Response (可以与传入的response相同,也可以是全新的对象), 该response会被在链中的其他中间件的 process_response() 方法处理。
如果其返回一个 Request 对象,则中间件链停止, 返回的request会被重新调度下载。处理类似于 process_request() 返回request所做的那样。
如果其抛出一个 IgnoreRequest 异常,则调用request的errback(Request.errback)。 如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样)。
参数:
request (Request 对象) – response所对应的request
response (Response 对象) – 被处理的response
spider (Spider 对象) – response所对应的spider
process_exception(request, exception, spider)
当下载处理器(download handler)或 process_request() (下载中间件)抛出异常(包括 IgnoreRequest 异常)时, Scrapy调用 process_exception() 。
process_exception() 应该返回以下之一: 返回 None 、 一个 Response 对象、或者一个 Request 对象。
如果其返回 None ,Scrapy将会继续处理该异常,接着调用已安装的其他中间件的 process_exception() 方法,直到所有中间件都被调用完毕,则调用默认的异常处理。
如果其返回一个 Response 对象,则已安装的中间件链的 process_response() 方法被调用。Scrapy将不会调用任何其他中间件的 process_exception() 方法。
如果其返回一个 Request 对象, 则返回的request将会被重新调用下载。这将停止中间件的 process_exception() 方法执行,就如返回一个response的那样。
参数:
request (是 Request 对象) – 产生异常的request
exception (Exception 对象) – 抛出的异常
spider (Spider 对象) – request对应的spider
参考:
官网https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
中文版: http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/downloader-middleware.html
- scrapy之ip池
- scrapy IP 池
- Python爬虫系列之----Scrapy(七)使用IP代理池
- Scrapy爬虫框架使用IP代理池
- 第1.7章 scrapy之ip代理的使用
- scrapy之user-agent池
- scrapy代理ip
- Scrapy添加随机ip
- python 爬虫scrapy框架 自建IP代理池
- Scrapy爬虫:代理IP配置
- Scrapy抓取西刺高匿代理ip
- 【scrapy ip代理池】如何解决ip被限制的问题
- 第2.1章 scrapy之国内高匿代理IP爬取
- Scrapy 0.22 文档翻译 之 Scrapy一瞥
- Scrapy进阶之Scrapy的架构
- scrapy 之二
- scrapy 之三
- scrapy爬虫之Spider
- C语言操作符总结1
- "Premium HDMI Cable" Certification -- What is it, and Why?
- okhttp-post
- Spring Boot错误处理
- 公有云厂商服务内容对比
- scrapy之ip池
- Docker基本操作
- 多线程下载(100%)
- 函数的重载,覆盖,隐藏区别
- iOS开发 仿微博的下拉提示框
- 初学者---Android 自定义控件之购物车数量加减器
- 通过 Visual Studio 的“代码度量值”来改进代码质量
- Android ListView批量选择(全选、反选、全不选)
- 使用AspectCore动态代理