
class NewrecordSpiderMiddleware(object):
# Not all methods need to be defined. If a method is not defined,
# scrapy acts as if the spider middleware does not modify the
# passed objects.
@classmethod
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders.
s = cls()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
# 进入spider 的response 的数据
# 和 downloadmiddle里面的process_response类似
# 先去downloadmiddleware那里的process_response 再到这里处理:
def process_spider_input(self, response, spider): # 处理进入spider中的response数据,但返回的是None
print('-----------------------3--------------------') # 对response筛选之后不能阻止进入spider 啥用?try--except---Exception,
print('---进入spidermiddleware----process_spider_input------response.url----%s--------'%(response.url))
# Called for each response that goes through the spider
try:
# middleware and into the spider.
# Should return None or raise an exception.
return None
except Exception as e:
print(e)
def process_spider_output(self, response, result, spider):
# Called with the results returned from the Spider, after
# it has processed the response.
# Must return an iterable of Request, dict or Item objects.
# result :经过parse_item 处理过后的输出结果,等于item数据也可以在这里处理,不过是在Pipline处理过后的数据
# parse_item 输出的结果先进入pipeline管道里去处理item数据最后回到process_spider_output这里,再就是关闭spider:
for i in result:
yield i
def process_spider_exception(self, response, exception, spider):
# Called when a spider or process_spider_input() method
# (from other spider middleware) raises an exception.
# Should return either None or an iterable of Response, dict
# or Item objects.
pass
# 处理start_urls 后面的url无关: 否则这方法不会运行,只能是start_urls参数
# 并且def 里面的东西只能是process_start_requests
# 处理start_urls 与后面的url无关:
def process_start_requests(self, start_urls, spider):
# Called with the start requests of the spider, and works # similarly to the process_spider_output() method, except
# that it doesn’t have a response associated.
# Must return only start_urls (not items).
for r in start_urls:
if str(r).find('rank_news') >= 0:
print('---------------------0-----------------------------')
print('-------------------进入Spider MiddleWare里面的开始爬去网页url-----------start_requests===:%s', r)
yield r
def spider_opened(self, spider):
spider.logger.info('Spider opened: %s ' %spider.name)
class NewrecordDownloaderMiddleware(object):
# Not all methods need to be defined. If a method is not defined,
# scrapy acts as if the downloader middleware does not modify the
# passed objects.
@classmethod
def from_crawler(cls, crawler):
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
# Proxy-Authorization base64代理账户验证
# encoded_user_pass = base64.b64encode(proxy_user_pass)
# request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
# request.meta['proxy'] = ['127.0.0.1:8000']
# request.meta['item']='' 在request meta 数据里面增加数据 可以用来传参
# request(url, meta['item']=item[], callback= '')
# request.cookies['']='' 往request里面增加cookies
def process_request(self, request, spider):
print('---------------1------------------')
print('----------------进入DownloadMiddleWare中的request的url是:%s----------------' %(request.url))
return None
# return None: continue processing this exception
# return a Response object: stops process_exception() chain
# return a Request object: stops process_exception() chain
def process_response(self, request, response, spider): # 处理所有爬过的网站的response,通过response.url 可以筛选
print('-----------------------------2---------------------------------') # 需要的爬取的网址,但这个在Rules里面更方便
print('----------------进入DownloadMiddleWare中的response的url是:%s----------------' %(response.url))
return response # 返回的response 进入spider 中的process_spider_input
def process_exception(self, request, exception, spider):
pass
def spider_opened(self, spider):
spider.logger.info('Spider opened: %s' % spider.name)
121 1,19 顶端
- Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法
Spider有以下属性: Spider属性 name 爬虫名称,定义Spider名字的字符串,必须是唯一的.常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字 ...
- 小白学 Python 爬虫(37):爬虫框架 Scrapy 入门基础(五) Spider Middleware
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline
1. Spider Middleware Spider Middleware是介入到Scrapy的Spider处理机制的钩子框架. 当Downloader生成Response之后,Response会被 ...
- python爬虫scrapy之downloader_middleware设置proxy代理
一.背景: 小编在爬虫的时候肯定会遇到被封杀的情况,昨天爬了一个网站,刚开始是可以了,在settings的设置DEFAULT_REQUEST_HEADERS伪装自己是chrome浏览器,刚开始是可以的 ...
- scrapy代理的设置
scrapy代理的设置 在我的上一篇文章介绍了scrapy下载器中间件的使用,这里的scrapyIP的代理就是用这个原理实现的,重写了下载器中间件的process_request(self,reque ...
- scrapy.Spider的属性和方法
scrapy.Spider的属性和方法 属性: name:spider的名称,要求唯一 allowed_domains:允许的域名,限制爬虫的范围 start_urls:初始urls custom_s ...
- scrapy spider官方文档
Spiders Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作 ...
- scrapy spider
spider 定义:在spiders文件夹中由用户自定义,继承scrapy.Spider类或其子类 Spider并没有提供什么特殊的功能. 其仅仅请求给定的 start_urls/start_requ ...
- scrapy的allowed_domains设置含义
设置allowed_domains的含义是过滤爬取的域名,在插件OffsiteMiddleware启用的情况下(默认是启用的),不在此允许范围内的域名就会被过滤,而不会进行爬取 但是有一个问题:像下面 ...
随机推荐
- qt button clicked(bool) always false
今天用 qt 中的按键的时候,希望按键有两种状态,通过 clicked(bool) 发送信号给槽,结果一直发的是 false,不能为 true,后来终于找到问题了,有两种解决方法. 在 button ...
- ServletContextListener中的方法contextInitialized执行了两次
有一个web06项目是直接拷贝web05的,复制过后web06项目默认的web配置中的Context Root还是web05,导致tomcat在启动时还是会创建两个web应用,修改成web06后,cl ...
- ios端滚动优化
加入css -webkit-overflow-scrolling: touch;
- Java好的的工具类:JSONResult
package com.nxhfzx.gdshopping.entity; import java.util.List; import com.fasterxml.jackson.databind.J ...
- Django06-ORM操作
ORM操作 1.基本操作 # 查 models.Tb1.objects.get(id=123) # 获取单条数据,不存在则报错(不建议) models.Tb1.objects.all() # 获取全部 ...
- 微信小程序海报生成功能
如果是H5页面的话给大家推荐一款不错的插件html2canvas,这个插件可以将html元素转为canvas并一键生成png图片,但是本文的重点是在小程序上如何实现生成图片的功能.因为小程序没有DOM ...
- 剑指offer——从上往下打印二叉树
题目描述:从上到下打印二叉树的节点,同一层的从左到右打印 思路:采用队列来存储单层的节点,然后通过删除队列的头结点操作,依次遍历每一层. 代码为: import java.util.ArrayList ...
- python视频学习笔记2(if)
一.if语句1.比较运算符,if语句语法 # 1. 输入用户年龄# 2. 判断是否满 18 岁 (**>=**)# 3. 如果满 18 岁,允许进网吧嗨皮# 4. 如果未满 18 岁,提示回家写 ...
- SQL Server中与IO相关的等待类型:IO_COMPLETION和PAGEIOLATCH_*
一个大的SQL语句操作,执行计划中包含了一个merge join操作,观察到SQL长时间处于IO_COMPLETION等待状态,如果是读取相关的表的数据,服务器应该全力为其服务,但是服务器的物理IO又 ...
- 如何实现word上传服务器
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...