python爬虫scrapy的使用
一、scrapy架构的组成
- 引擎:自动运行,不需要关注,会自动组织所有的请求对象,分发给下载器;
- 下载器:从引擎处获取到请求对象后,请求数据;
- spiders:Spider类定义了如何爬取某些网站;
- 调度器:有自己的调度规则,不需要关注;
- 中间件:下载中间件、Spider中间件;
- 管道:最终处理数据的管道,会预留接口供我们处理数据。当Item在Spider中被收集后,将会被传递给Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。每个Item Pipeline组件是实现了简单方法的Python类,收到Item后执行一些操作,也决定这个Item是否继续通过Pipeline或是被丢弃。
二、scrapy工作原理
- 当爬虫(Spider)要爬取某URL地址的页面时,使用该URL初始化Request对象提交给引擎(Scrapy Engine),并设置回调函数。爬虫中初始的Request是通过调用start_requests()来获取的,读取start_urls中的URL并使用parse为回调函数生成Request。
- Request对象进入调度器(Scheduler)按某种算法进行排队,之后的每个时刻调度器将其出列,送往下载器。
- 下载器(Downloader)根据Request对象中的URL地址发送一次HTTP请求到网络服务器把资源下载下来,并封装成应答包(Response)。
- 应答包Response对象最终会被传递给爬虫的页面解析函数进行处理。
- 若是解析出来实体(Item),则交给实体管道(Item Pipeline)进一步处理。由Spider返回的Item将被存到数据库或使用Feed exports存入到文件中。
- 若是解析出的是链接(URL),则把链接给交调度器等待抓取。
三、scrapy爬取百度热搜
- 创建爬虫项目baidu_hot_bot
scrapy startproject baidu_hot_bot
- 创建爬虫hot_bot
scrapy genspider hot_bot www.baidu.com
(1)在setting.py中添加配置
# 配置请求头中的User-Agent
USER_AGENT = '从浏览器请求中获取'
# 配置不遵守robots协议
ROBOTSTXT_OBEY = False
# 只有在错误的情况下才显示日志文件
LOG_LEVEL = 'ERROR'
(2)管道文件pipelines.py用于处理下载数据的后续处理
# 使用一个接口处理不同类型的实体
from itemadapter import ItemAdapter
class BaiduHotBotPipeline:
class process_item(self, item, spider):
return item
(3)在爬虫hot_bot.py中编写爬虫
import scrapy
class HotBotSpider(scrapy.Spider):
name = 'hot_bot' # 爬虫名称
# 允许的域名:限定的start_urls列表中那些url可以发送请求,可以不用指定
# allowed_domains = ['www.baidu.com']
# 起始url列表:scrapy自动对列表中的每个url发起请求
start_urls = ['https://www.baidu.com/']
# 当scrapy自动向url列表中每个url发出请求后,response保存响应结果,
# response.body响应的是二进制文件,response.text响应的是字符串,
# repsponse.xpath()是xpath方法的返回值类型是selector列表
def parse(self, response):
hots = response.xpath('//ul[@id="hotsearch-content-wrapper"]/li')
for hot in hots:
contents = hot.xpath("./a//span[@class='title-content-title']//text()").extract()
title = "".join(contents)
print(title)
- 执行爬虫文件
scrapy crawl hot_bot