Scrapy中间件的使用-爬取豆瓣top250/PM2.5历史数据
python编程快速上手(持续更新中…)
python爬虫从入门到精通
Scrapy爬虫框架
文章目录
- python编程快速上手(持续更新中…)
- python爬虫从入门到精通
- Scrapy爬虫框架
- 1. scrapy中间件的分类和作用
- 1.1 scrapy中间件的分类
- 1.2 scrapy中间的作用:预处理request和response对象
- 2. 下载中间件的使用方法:
- Downloader Middlewares默认的方法:process_request(self, request, spider):
- 3.定义实现随机User-Agent的下载中间件
- 3.1 爬虫豆瓣top250
- 3.2 在middlewares.py中完善代码
- 4. 代理ip的使用
- 5. 在中间件中使用selenium
- 5.1 完成爬虫代码
- 5.2 在middlewares.py中使用selenium
1. scrapy中间件的分类和作用
1.1 scrapy中间件的分类
根据scrapy运行流程中所在位置不同分为:
1.下载中间件
2.爬虫中间件
1.2 scrapy中间的作用:预处理request和response对象
1.对header以及cookie进行更换和处理
2.使用代理ip等
3.对请求进行定制化操作,但在scrapy默认的情况下,两种中间件都在middlewares.py一个文件中。爬虫中间件使用方法和下载中间件相同,且功能重复,通常使用下载中间件
2. 下载中间件的使用方法:
通过下载中间件来学习如何使用中间件编写一个Downloader Middlewares和我们编写一个pipeline一样,定义一个类,然后在setting中开启
Downloader Middlewares默认的方法:process_request(self, request, spider):
当每个request通过下载中间件时,该方法被调用。
1.返回None值:没有return也是返回None,该request对象传递给下载器,或通过引擎传递给其他权重低的process_request方法
2.返回Response对象:不再请求,把response返回给引擎
3.返回Request对象:把request对象通过引擎交给调度器,此时将不通过其他权重低的process_request方法
解释:
None:如果所有下载器中间件返回None,则请求最终交给下载器处理
Request:如果返回为请求,则将请求交给调度器
Response:如果返回为响应,将响应对象交给spide进行解析
process_response(self, request, response, spider):
当下载器完成http请求,传递响应给引擎的时候调用
1.返回Resposne:通过引擎交给爬虫处理或交给权重更低的其他下载中间件的process_response方法
2.返回Request对象:通过引擎交给调取器继续请求,此时将不通过其他权重低的process_request方法
在settings.py中配置开启中间件,权重值越小越优先执行
解释:
Request:如果返回为请求,则将请求交给调度器
Response:将响应对象交给spider进行解析
3.定义实现随机User-Agent的下载中间件
3.1 爬虫豆瓣top250
1.创建工程
scrapy startproject Douban
2.建模(item.py)
class DoubanItem(scrapy.Item):# define the fields for your item here like:name = scrapy.Field()
3.创建爬虫
cd Douban
scrapy genspider movie douban.com
4.替换(movie.py)
start_urls = [‘https://movie.douban.com/top250’]
5.获取类表
movie_list = response.xpath(’//*[@id=“content”]/div/div[1]/ol/li/div/div[2]’) print(len(movie_list))
6.运行测试
scrapy crawl movie
拿不到robots.txt,被识别成爬虫
7.配置User_Agent(settings.py)
USER_AGENT = ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36’
8.代码实现
import scrapy
from Douban.items import DoubanItemclass MovieSpider(scrapy.Spider):name = 'movie'allowed_domains = ['douban.com']start_urls = ['https://movie.douban.com/top250']def parse(self, response):print(response.request.headers['User-Agent'])movie_list = response.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]')# print(len(movie_list)) #25for movie in movie_list:item = DoubanItem()item['name'] = movie.xpath('./div[1]/a/span[1]/text()').extract_first()yield itemnext_url = response.xpath('//*[@id="content"]/div/div[1]/div[2]/span[3]/a/@href').extract_first()if next_url != None:next_url = response.urljoin(next_url)yield scrapy.Request(url=next_url)
3.2 在middlewares.py中完善代码
1.删除里面内容
2.settings添加User_Agent列表
USER_AGENT_LIST = [
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5 ",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14 ",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20 ",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27 ",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1 ",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7 ",
"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 ",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 ",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110622 Firefox/6.0a2 ",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 ",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b4pre) Gecko/20100815 Minefield/4.0b4pre ",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Beamrise/17.2.0.9 Chrome/17.0.939.0 Safari/535.8 ",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/18.6.872.0 Safari/535.2 UNTRUSTED/1.0 3gpp-gba"
]
2.启用
在settings中设置开启自定义的下载中间件,设置方法同管道
DOWNLOADER_MIDDLEWARES = {'Douban.middlewares.RandomUserAgent': 543,
}
3.随机请求头
# 定义一个中间件类
class RandomUserAgent(object):def process_request(self, request, spider):# print(request.headers['User-Agent'])ua = random.choice(USER_AGENT_LIST)request.headers['User-Agent'] = ua
4. 代理ip的使用
免费代理ip和收费代理ip:
1.settings添加PROXY_LIST列表
PROXY_LIST =[{"ip_port": "123.207.53.84:16816", "user_passwd": "morganna_mode_g:ggc22qxp"},{"ip_port": "27.191.60.100:3256"},
]
2.启用代理
DOWNLOADER_MIDDLEWARES = {'Douban.middlewares.RandomProxy': 543,
}
3.代理ip
class RandomProxy(object):def process_request(self, request, spider):proxy = random.choice(PROXY_LIST)print(proxy)if 'user_passwd' in proxy:# 对账号密码进行编码,python3中base64编码的数据必须是bytes类型,所以需要encodeb64_up = base64.b64encode(proxy['user_passwd'].encode())# 设置认证request.headers['Proxy-Authorization'] = 'Basic ' + b64_up.decode()# 设置代理request.meta['proxy'] = proxy['ip_port']else:# 设置代理request.meta['proxy'] = proxy['ip_port']
4.检测代理ip是否可用
在使用了代理ip的情况下可以在下载中间件的process_response()方法中处理代理ip的使用情况,如果该代理ip不能使用可以替换其他代理ip
class ProxyMiddleware(object):def process_response(self, request, response, spider):if response.status != '200':request.dont_filter = True # 重新发送的请求对象能够再次进入队列return request
5. 在中间件中使用selenium
以PM2.5历史数据_空气质量历史数据查询为例,需求更换请求,爬取几条就会被禁用
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
5.1 完成爬虫代码
# -*- coding: utf-8 -*-
import scrapy
from AQI.items import AqiItem
import timeclass AqiSpider(scrapy.Spider):name = 'aqi'allowed_domains = ['aqistudy.cn']host = 'https://www.aqistudy.cn/historydata/'start_urls = [host]# 解析起始url对应的响应def parse(self, response):#获取城市url列表url_list = response.xpath('//div[@class="bottom"]/ul/div[2]/li/a/@href').extract()# 遍历列表for url in url_list[45:48]:city_url = response.urljoin(url)# 发起对城市详情页面的请求yield scrapy.Request(city_url, callback=self.parse_month)# 解析详情页面请求对应的响应def parse_month(self, response):# 获取每月详情url列表url_list = response.xpath('//ul[@class="unstyled1"]/li/a/@href').extract()# 遍历url列表中的部分for url in url_list[30:31]:month_url = response.urljoin(url)# 发起详情页面请求yield scrapy.Request(month_url, callback=self.parse_day)# 在详情页面解析数据def parse_day(self, response):print (response.url,'######')# 获取所有的数据节点node_list = response.xpath('//tr')city = response.xpath('//div[@class="panel-heading"]/h3/text()').extract_first().split('2')[0]# 遍历数据节点列表for node in node_list:# 创建存储数据的item容器item = AqiItem()# 先填写一些固定参数item['city'] = cityitem['url'] = response.urlitem['timestamp'] = time.time()# 数据item['date'] = node.xpath('./td[1]/text()').extract_first()item['AQI'] = node.xpath('./td[2]/text()').extract_first()item['LEVEL'] = node.xpath('./td[3]/span/text()').extract_first()item['PM2_5'] = node.xpath('./td[4]/text()').extract_first()item['PM10'] = node.xpath('./td[5]/text()').extract_first()item['SO2'] = node.xpath('./td[6]/text()').extract_first()item['CO'] = node.xpath('./td[7]/text()').extract_first()item['NO2'] = node.xpath('./td[8]/text()').extract_first()item['O3'] = node.xpath('./td[9]/text()').extract_first()# for k,v in item.items():# print k,v# print '##########################'# 将数据返回给引擎yield item
5.2 在middlewares.py中使用selenium
from selenium import webdriver
import time
from scrapy.http import HtmlResponse
from scrapy import signalsclass SeleniumMiddleware(object):def process_request(self, request, spider):url = request.urlif 'daydata' in url:driver = webdriver.Chrome()driver.get(url)time.sleep(3)data = driver.page_sourcedriver.close()# 创建响应对象res = HtmlResponse(url=url, body=data, encoding='utf-8', request=request)return res
Scrapy中间件的使用-爬取豆瓣top250/PM2.5历史数据相关推荐
- scrapy爬取豆瓣top250电影数据
scrapy爬取豆瓣top250电影数据 scrapy框架 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. sc ...
- 使用python的scrapy框架简单的爬取豆瓣读书top250
使用python的scrapy框架简单的爬取豆瓣读书top250 一.配置scrapy环境 1. 配置相应模块 如果没有配置过scrapy环境的一般需要安装lxml.PyOpenssl.Twisted ...
- scrapy爬取豆瓣top250详情信息
1.项目简介 本次项目利用scrapy爬虫框架实现抓取豆瓣top250的详情页信息,主要字段如下: 主要字段: Num-->电影排名 DetailLink-->详情页链接 Title- ...
- python爬虫爬取豆瓣top250电影影评
信息系统课程项目,小组准备做一个电影推荐系统,自己选了觉得很有趣的资源模块,需要获取电影的评价资源等信息.花了大约一周看Web Scraping with Python这本书,对爬虫有了大体但是初略的 ...
- [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息
这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对 ...
- python豆瓣历史评分_Python实战-爬取豆瓣top250评分高于指定值的电影信息
思路 1. 要获得怎么样的数据 2. 找到数据来源 3. 模拟浏览器发送请求获得数据 4. 处理数据,保存数据 第一步: 在这里数据是豆瓣top250中高于指定分数的电影信息 信息有:名称,评分,格言 ...
- lxml 爬取豆瓣top250
lxml 爬取豆瓣top250 菜鸟奋战10小时,得到豆瓣top250 from time import sleepimport urllib3 import pandas as pd urllib3 ...
- python爬取豆瓣图书top250_「豆瓣读书250」爬取豆瓣TOP250书单 - seo实验室
豆瓣读书250 小白学习爬虫 爬取豆瓣TOP250的书,正好本人也喜欢看书 思路分析: https://book.douban.com/top250这是TOP250第一页的链接 https://boo ...
- 爬取豆瓣top250电影并分析
爬取豆瓣top250电影,提取评论关键词,然后将同一国家的关键词做成一个词云,轮廓是每个国家的地图轮廓 爬取数据 需要爬取电影名称.导演.年份.地区和前10个评论除了地区,其他的都没什么问题,我们来研 ...
最新文章
- java自由块_JAVA 静态的自由块和非静态的自由块
- Java8函数式编程(5)--中间操作(源码)
- windows安装go环境变量
- Perl的浅拷贝和深度拷贝
- 04数据库的高级查询
- c语言实验题水仙花数5359,《C语言程序设计》实验报告(实验1-12).doc
- AngularJS中的DOM value与view value
- 计算机专业基础 -- 网络相关AJAX基础知识
- PHPMailer的使用
- oracle的汇总模板,Oracle EBS汇总模板建立问题处理
- 改造u3d第一人称控制器,使之适合Cardboard+蓝牙手柄控制
- 【数字信号处理】基于matlab GUI IIR低通+FIR高通信号时域+频谱分析【含Matlab源码 1029期】
- 【服务器数据恢复】EMC Isilon存储误删除的数据恢复案例
- vue引入阿里巴巴icon
- 升级主机后网站显示服务器过期,虚拟主机常见问题解答
- 详谈什么是接口测试?
- KEIL仿真 logic analyzer
- Linux常用指令(ubuntu)
- Euraka 服务注册与发现
- 创建springboot项目