scrapy项目中的middlewarse.py中间件  

爬虫中间件:目前先不介绍

下载中间件(需要在settings.py中开启) 

                

(1)请求处理函数:process_request(self, request, spider)
  可以针对url请求指定UA伪装、配置代理等功能(UA伪装可以在settings.py中进行全局配置,代理配置更倾向于在异常处理函数,大部分异常都是因为ip的问题)  
   def process_request(self, request, spider):
#UA伪装
# request.headers['User-Agent']=random.choice(UA_list) #ip代理配置(一般更多的放在process_exception异常处理函数中)
# request.meta['proxy']='http[s]://ip:port'
return None

process_request

(2)响应处理函数:process_response(self, request, response, spider)
  对于一些网页请求,立即相应的数据可能不完全,页面部分内容是通过触发滚轮或者下拉操作才会动态加载的数据,因此获取的到数据并不是完整的,需要对响应对象进行篡改(比如通过selenium模拟浏览器操作获取到完整数据)后返回。
  
(3)异常处理函数:process_exception(self, request, exception, spider)
  对于请求异常处理,一般可以更换ip设置代理操作
  def process_exception(self, request, exception, spider):
#对请求异常进行修正
#更换代理(一定要 return request将请求返回以便再次发起)
# request.meta['proxy']='http[s]://ip:port'
# return request
pass

process_exception

网易新闻爬取案例:

  分析页面可以获知不同板块内容都是页面下拉动态加载的:国内、国际、军事、航空、无人机这几个板块内容都是标题都是在div中的一个a标签中,因此统一来进行爬取解析!

  1.新建爬虫项目  

scrapy startproject firstPro
cd firstPro
scrapy genspider middlewareTest www.xxx.com  

  2.编写爬虫文件middlewareTest.py

 # -*- coding: utf-8 -*-
import scrapy
from firstPro.items import FirstproItem
from selenium import webdriver class MiddlewaretestSpider(scrapy.Spider):
name = 'middlewareTest'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://news.163.com/']
plate_urls=[]#存放板块的url,以便在下载中间件次改请求获取完整标题数据
def __init__(self):
self.bro=webdriver.Chrome(executable_path=r'E:\Python项目\爬虫\day110_20190809(全站爬取、分布式爬虫)\firstPro\firstPro\spiders\chromedriver.exe')#初始化浏览器实例
def parse(self, response):
#解析首页标题板块
li_list=response.xpath('//div[@class="ns_area list"]/ul/li')
print(len(li_list))
#确定爬取的板块
index_list=[4,5,7,8,9]
for index in index_list:
item=FirstproItem()
plate=li_list[index-1].xpath('./a/text()').extract_first()
url=li_list[index-1].xpath('./a/@href').extract_first()
self.plate_urls.append(url)
item['plate']=plate
# 对每个板块进行发起请求,获取标题信息
yield scrapy.Request(url,callback=self.parse_title,meta={"item":item})
break
#对每个板块的新闻标题进行解析,但是新闻标题都是动态加载的,因此直接的响应对象不完整,需要通过下载中间件对新闻板块标题获取进行处理
#解决思路:为获取板块完整标题内容,需要模拟浏览器下拉操作,结合使用selenuim在下载中间件进行操作
def parse_title(self, response):
item=response.meta['item']
#解析每个板块中的新闻标题
div_list=response.xpath('//div[@class="ndi_main"]/div')
for div in div_list:
title=div.xpath('./div/div[1]/h3/a/text()').extract_first()
url=div.xpath('./div/div[1]/h3/a/@href').extract_first()
item["title"]=title
#对每个标题详情发起请求
yield scrapy.Request(url,callback=self.parse_detail,meta={"item":item}) def parse_detail(self,response):
item = response.meta['item']
#解析每个标题对应的详细新闻内容
content="".join(response.xpath('//*[@id="endText"]//text()').extract())
item["content"]=content
yield item # 程序全部结束的时候被调用
def closed(self, spider):
print('结束爬虫!!!')
self.bro.quit()

爬虫脚本middlewareTest.py

  3.定义items.py字段属性

 import scrapy

 class FirstproItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
#新闻板块
plate=scrapy.Field()
#新闻标题
title=scrapy.Field()
#新闻详情
content=scrapy.Field()
pass

items.py

  4.管道pipelines.py持久化

 import redis
class FirstproPipeline(object):
#持久化存储在redis数据库中
conn=None
# def open_spider(self,spider):
# self.conn=redis.Redis(host="127.0.0.1",port=6379) def process_item(self, item, spider):
# self.conn.lpush('wangyi',dict(item))
print(item)
return item

pipelines.py

  5.settings.py配置

 #UA伪装
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" #robots协议
ROBOTSTXT_OBEY = False #输出日志等级
LOG_LEVEL="ERROR" #打开下载中间件
DOWNLOADER_MIDDLEWARES = {
'firstPro.middlewares.FirstproDownloaderMiddleware': 543,
} #打开管道
ITEM_PIPELINES = {
'firstPro.pipelines.FirstproPipeline': 300,
}

scrapy中间件之下载中间件使用(网易新闻爬取)的更多相关文章

  1. python爬虫---scrapy框架爬取图片,scrapy手动发送请求,发送post请求,提升爬取效率,请求传参(meta),五大核心组件,中间件

    # settings 配置 UA USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, l ...

  2. scrapy架构与目录介绍、scrapy解析数据、配置相关、全站爬取cnblogs数据、存储数据、爬虫中间件、加代理、加header、集成selenium

    今日内容概要 scrapy架构和目录介绍 scrapy解析数据 setting中相关配置 全站爬取cnblgos文章 存储数据 爬虫中间件和下载中间件 加代理,加header,集成selenium 内 ...

  3. Python 网络爬虫 006 (编程) 解决下载(或叫:爬取)到的网页乱码问题

    解决下载(或叫:爬取)到的网页乱码问题 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyCharm 20 ...

  4. Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫

    如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:P ...

  5. python 全栈开发,Day138(scrapy框架的下载中间件,settings配置)

    昨日内容拾遗 打开昨天写的DianShang项目,查看items.py class AmazonItem(scrapy.Item): name = scrapy.Field() # 商品名 price ...

  6. scrapy框架4——下载中间件的使用

    一.下载中间件 下载中间件是scrapy提供用于用于在爬虫过程中可修改Request和Response,用于扩展scrapy的功能:比如: 可以在请求被Download之前,请求头部加上某些信息(例如 ...

  7. scrapy框架之下载中间件

    介绍 中间件是Scrapy里面的一个核心概念.使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫. “中间件”这个中文名字和前面章节讲到的“中间人”只 ...

  8. Scrapy教程——搭建环境、创建项目、爬取内容、保存文件

    1.创建项目 在开始爬取之前,您必须创建一个新的Scrapy项目.进入您打算存储代码的目录中,运行新建命令. 例如,我需要在D:\00Coding\Python\scrapy目录下存放该项目,打开命令 ...

  9. Scrapy分布式爬虫打造搜索引擎- (二)伯乐在线爬取所有文章

    二.伯乐在线爬取所有文章 1. 初始化文件目录 基础环境 python 3.6.5 JetBrains PyCharm 2018.1 mysql+navicat 为了便于日后的部署:我们开发使用了虚拟 ...

随机推荐

  1. Apache Rewrite实现URL的跳转和域名跳转

    Apache Rewrite实现URL的跳转和域名跳转   Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基 于服务器级的(httpd.conf)和目录级的 (.h ...

  2. 2019-2020-1 20199328《Linux内核原理与分析》第九周作业

    笔记部分 2019/11/12 14:45:44 从CPU和内存的角度看linux系统的运行 CPU角度:首先我们进行了系统调度,然后系统进入内核态,把信息压栈,然后我们进行进程管理,由于进入系统调用 ...

  3. 安装 wbemcli

    安装环境        建立自己的目录后,             wget http://vault.centos.org/6.0/os/x86_64/Packages/sblim-wbemcli- ...

  4. MySQL简介和安装

    一.关系型数据库初识 1.1 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我 ...

  5. 谈谈Java的线程池设计

    在实际项目中,如果因为想异步执行暂时性的任务而不断创建线程是很浪费资源的事情(当一个任务执行完后,线程也没用了).这种情况下,最好是将任务提交给线程池执行. 所谓池,就是将管理某一种资源,对资源进行复 ...

  6. JS的String()、toString()、valueOf()的一些隐秘特性

    toString()方法 要把一个值转换为一个字符串,最常用的就是,使用几乎每个值都有的toString()方法,这个方法唯一要做的就是返回相应值的字符串表现. 数值.布尔值.对象和字符串值(没错,每 ...

  7. zabbix3.x.x升级教程

    1:停掉正在运行的zabbix服务,确保没有新数据写入数据库. /etc/init.d/zabbix_server stop 2:备份原zabbix的数据库数据,以及相关文件. mysqldump - ...

  8. POJ 1905 Expanding Rods(二分)

    Expanding Rods Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 20224 Accepted: 5412 Descr ...

  9. 一只简单的网络爬虫(基于linux C/C++)————浅谈并发(IO复用)模型

    Linux常用的并发模型 Linux 下设计并发网络程序,有典型的 Apache 模型( Process Per Connection ,简称 PPC ), TPC ( Thread Per Conn ...

  10. ansible roles 自动化安装

    例:  ansible roles 自动化安装memcached 文件目录结构如下: cat memcached_role.yml - hosts: memcached remote_user: ro ...