scrapy框架的中间件
中间件的使用
作用:拦截所有的请求和响应
拦截请求:process_request拦截正常的请求,process_exception拦截异常的请求
篡改请求的头信息
def process_request(self, request, spider):
print('proces_request!!!')
#UA伪装
request.headers['User-Agent'] = random.choice(self.user_agent_list)
return None # user_agent_list 这个列表中是大量的浏览器信息为了给User-Agent切换信息
代理
#拦截发生异常的请求,目的就是为了将异常的请求进行修正,然后将修正之后的正常的请求进行重新发送
def process_exception(self, request, exception, spider):
#代理操作
# request.meta['proxy'] = 'http://ip:port'
print('i am exception!!!')
return request
注意:
process_exception,return request的作用是将修正后的请求重新发送
拦截响应 ------ 以爬取网易新闻为例
篡改响应数据
- 不满足需求的响应数据对应的一定是不满足需求的响应对象
- 直接更换响应对象
需求:爬取网易新闻中国内,国际,军事,航工,无人机这五个板块下所有的新闻标题和内容
- 如何通过中间件更换不满足需求的响应对象
selenum如何作用到scrapy中
分析:每一个板块中显示的新闻标题是动态加载的
selenium在scrapy中的编码流程:- 实例化浏览器对象:爬虫类中将实例化出来的浏览器作为爬虫类的一个属性属性可以交互给中间件类
- 编写自动化操作:写在中间件的
process_response中 - 关闭浏览器:写在爬虫类的
closed(self)方法中
代码实现:
爬虫文件得到代码:
# -*- coding: utf-8 -*-
import scrapy
from selenium import webdriver
from wangyiPro.items import WangyiproItem
class WangyiSpider(scrapy.Spider):
name = 'wangyi'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://news.163.com/']
#整个项目中涉及的响应对象个数:
# - 1+5+n
#解析:解析五个新闻板块对应的url
five_model_urls = []
bro = webdriver.Chrome(executable_path=r'C:\Users\Administrator\Desktop\爬虫+数据+算法\chromedriver.exe') #方法只会被调用一次
def closed(self,spider):
self.bro.quit() def parse(self, response):
li_list = response.xpath('//*[@id="index2016_wrap"]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li')
model_indexs = [3,4,6,7,8]
for index in model_indexs:
li_tag = li_list[index]
#解析出了每一个板块对应的url
model_url = li_tag.xpath('./a/@href').extract_first()
self.five_model_urls.append(model_url)
#对每一个板块的url进行手动的请求发送
yield scrapy.Request(model_url,callback=self.parse_model) #解析:每一个板块中的新闻标题和新闻详情页的url(两个值都是动态加载出来的)
def parse_model(self,response):
#遇到了不满足需求的响应对象就是当前方法中的response参数
div_list = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div/div/ul/li/div/div')
for div in div_list:
title = div.xpath('./div/div[1]/h3/a/text()').extract_first()
detail_url = div.xpath('./div/div[1]/h3/a/@href').extract_first()
item = WangyiproItem()
item['title'] = title
if detail_url:
yield scrapy.Request(detail_url,callback=self.parse_detail,meta={'item':item}) def parse_detail(self,response):
item = response.meta['item']
content = response.xpath('//*[@id="endText"]//text()').extract()
content = ''.join(content)
item['content'] = content yield item
items.py文件的代码:
import scrapy class WangyiproItem(scrapy.Item):
# define the fields for your item here like:
title = scrapy.Field()
content = scrapy.Field()middlewares.py文件的代码:中间件
# -*- coding: utf-8 -*- # Define here the models for your spider middleware
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/spider-middleware.html from scrapy import signals
from scrapy.http import HtmlResponse
from time import sleep class WangyiproDownloaderMiddleware(object): def process_request(self, request, spider):
return None
#拦截所有的响应(1+5+n),只有5个响应不满足需求
def process_response(self, request, response, spider):
#1.将拦截到所有的响应中的指定5个不满足需求的响应对象找出
# request.url:每一个响应对应的url
#spider.five_model_urls:5个板块对应的url
# print(spider.five_model_urls)
if request.url in spider.five_model_urls:
#满足if条件的response就是5个板块对应的response
spider.bro.get(request.url)#对每一个板块对应的url进行get请求发送
sleep(3)
spider.bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(2)
spider.bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(2)
page_text = spider.bro.page_source
new_response = HtmlResponse(url=request.url,body=page_text,encoding='utf-8',request=request)
return new_response
#2.将这5个响应对象删除,实例化5个新的响应对象
#3.保证5个新的响应对象中包含动态加载出来的新闻标题数据
#4.将满足需求的5个新的响应对象返回
else:
return response def process_exception(self, request, exception, spider): pass
注:记得在
settings.py文件中开启对应的操作
scrapy框架的中间件的更多相关文章
- 爬虫2.5-scrapy框架-下载中间件
目录 scrapy框架-下载中间件 scrapy框架-下载中间件 middlewares.py中有两个类,一个是xxSpiderMiddleware类 一个是xxDownloaderMiddlewar ...
- python 全栈开发,Day138(scrapy框架的下载中间件,settings配置)
昨日内容拾遗 打开昨天写的DianShang项目,查看items.py class AmazonItem(scrapy.Item): name = scrapy.Field() # 商品名 price ...
- scrapy框架中间件配置代理
scrapy框架中间件配置代理import random#代理池PROXY_http = [ '106.240.254.138:80', '211.24.102.168:80',]PROXY_http ...
- scrapy框架之下载中间件
介绍 中间件是Scrapy里面的一个核心概念.使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫. “中间件”这个中文名字和前面章节讲到的“中间人”只 ...
- Python爬虫从入门到放弃(十一)之 Scrapy框架整体的一个了解
这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider ...
- Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理
这一篇文章主要是为了对scrapy框架的工作流程以及各个组件功能的介绍 Scrapy目前已经可以很好的在python3上运行Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是 ...
- Scrapy框架
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...
- python爬虫入门(六) Scrapy框架之原理介绍
Scrapy框架 Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬 ...
- Scrapy 框架流程详解
框架流程图 Scrapy 使用了 Twisted 异步非阻塞网络库来处理网络通讯,整体架构大致如下(绿线是数据流向): 简单叙述一下每层图的含义吧: Spiders(爬虫):它负责处理所有Respon ...
随机推荐
- GitHub 上的大佬们打完招呼,会聊些什么?
你好 GitHub!每一位开源爱好者的好朋友「HelloGitHub」 大家好,今儿 HG 有幸邀请到:Lanking 一位亚马逊 AI 软件工程师.开源爱好者和贡献者.他是亚马逊开源的 Java 深 ...
- python之解压序列并赋值给变量
N个数量的序列(可迭代对象),赋值给N个变量. 字符串: 1 #!usr/bin/env python3 2 # -*- Coding=utf-8 -*- 3 4 ''' 5 解压序列(或者任何可迭代 ...
- webform中配置服务器控件的样式
前台 Style <asp:Label ID="Label1" runat="server" Text="Label" Style=& ...
- JAVA读取EXCEL_自动生成实体类
代码实现PropertyAnno.java import java.lang.annotation.ElementType; import java.lang.annotation.Retention ...
- ta-lib安装问题
不管是windows还是linux,直接使用pip install ta-lib都会出现各种各样的问题,如下图: 解决办法,从网上找了很多办法都不好用,最后发现直接从晚上down .whl的文件,然后 ...
- rocketmq 架构设计
1 消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分,本节将分别从RocketMQ的消息存储整体架构.PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三方面 ...
- java HttpClicent网络请求与解析
HttpClicent是Apache下的一个子项目,文档齐全,详见官网:http://hc.apache.org/httpcomponents-client-4.5.x/quickstart.html ...
- 漫画|web的主要安全问题
在此主要说现在市面上存在的4个比较多的安全问题 一.钓鱼 钓鱼: 比较有诱惑性的标题 仿冒真实网站 骗取用户账号 骗取用户资料 二.篡改页面 有一大部分被黑的网站中会有关键字 (在被黑的网站中,用的最 ...
- WPF学习笔记01_XAML之简介
简介 XAML (发音"zammel" 咋么儿),用于实例化.NET对象的标记语言,主要用于构造WPF的用户界面.类似html标记语言. 通过XAML,程序员可以用代码的方式对界面 ...
- 初识sa-token,一行代码搞定登录授权!
前言 在java的世界里,有很多优秀的权限认证框架,如Apache Shiro.Spring Security 等等.这些框架背景强大,历史悠久,其生态也比较齐全. 但同时这些框架也并非十分完美,在前 ...