万能仓库: https://www.lfd.uci.edu/~gohlke/pythonlibs/
pywin32: https://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/
scrapy是一个十分强大的爬虫框架,依赖的库比较多,至少需要依赖的库有:Twisted,lxml,pywin32。在安装之前,确保这些基本库已经安装好。scrapy是一个基于Twisted的异步处理框架,其架构清晰,模块之间的耦合程度低,可扩展性极强,可以灵活完成各种需求。我们只需要定制开发几个模块就可以轻松实现一个爬虫。其内部集成多进程,多线程,去重队列等基础功能。
安装scrapy
pip install scrapy
1.架构介绍
engine 引擎,处理整个系统的数据流处理,触发事务,是整个框架的核心。
Item 项目,它定义了爬取结果的数据结构,爬取的数据会被赋值成该item对象。
Scheduler 调度器,接受引擎发过来的请求并将其加入队列中,在引擎再次请求的时候将请求提供给引擎。
Downloader 下载器,下载网页内容,并将网页内容返回给蜘蛛。
Spiders 蜘蛛,其内定义了爬取的逻辑和网页的解析规则,它主要负责解析响应并生成提取结果和新的请求。
Item Pipeline 项目管道,负责处理由蜘蛛从网页中抽取的项目,它的主要任务是清洗,验证和存储数据
Downloader Middlewares 下载器中间件,位于引擎和下载器之间的钩子框架,主要处理引擎与下载器之间的请求及响应
Spider Middlewares 蜘蛛中间件 , 位于引擎和蜘蛛之间的钩子框架,主要处理向蜘蛛输入的响应和输出的结果及新的请求。
2.数据流
Scrapy中的数据流由引擎控制,数据流的过程如下:
首先蜘蛛发送请求到引擎,引擎将请求发送给调度器,调度器将请求添加到队列中,当引擎再次请求的时候,将请求提供给引擎,引擎将请求通过下载器中间件发送给下载器,下载器下载网页内容,并将网页内容通过引擎返回到蜘蛛,蜘蛛对网页内容进行解析,将数据发送给管道并发送新的请求到引擎,管道对获得的数据进行清洗,验证和存储。周而复始。
3.项目结构
(1)创建工程
scrapy startproject 工程名字
(2)认识目录结构
qiubaipro 工程总目录
qiubaipro 工程核心目录
__pycache__ python的缓存文件
spiders 爬虫核心目录
__pycache__
__init__.py
lala.py 爬虫文件(*)
__init__.py 包的标记
items.py 定义数据结构的地方(*)
middlewares.py 各种中间件放的地方
pipelines.py 管道文件(*)
settings.py 工程配置文件(*)
scrapy.cfg 部署工程的配置文件(一般不用)
(3)生成爬虫文件
scrapy genspier 爬虫名字 爬取域名
生成参数的意思去看爬虫文件里面的注释即可
(4)启动爬虫
cd qiubaipro/qiubaipro/spiders
来到settings配置文件中,将遵从robots协议注释掉,定制自己的UA,或者定制自己的请求头部
scrapy crawl 爬虫名字
response是一个对象
response.url 请求的url
response.status 状态码
response.headers 响应头
response.text 响应的字符串格式内容
response.body 响应的字节格式内容
response.xpath() 方法用来提取数据
scrapy已经为你集成好了xpath和选择器方法,直接使用即可,和以前的略有不同,以前无论获取文本还是属性得到的都是字符串格式内容,现在得到的是selector对象,要通过extract()进行提取你的字符串格式内容
(5)输出格式
scrapy crawl qiubai -o qiubai.json
scrapy crawl qiubai -o qiubai.xml
scrapy crawl qiubai -o qiubai.csv
4.scrapy shell
scrapy shell是什么?是scrapy的一个终端调试工具。提取数据,就要写xpath。在这里可以调试xpath,如果这里写对了,到代码中肯定对
如何使用
pip install ipython
scrapy shell url
一般情况在终端任意界面就可以输入这个指令
特殊情况,需要新建工程,配置好,保证没有语法错误,在工程目录下进入cmd,通过scrapy shell调试这个页面
response.xpath() 返回是列表,列表里面都是selector对象
ret.extract()[0] === ret[0].extract() == ret.extract_first()
如果ret是空列表,前面两个会报错,而extract_first()会获取得到None
response.css() 就是以前的soup.select()
scrapy自己封装的这种写法,以前的bs没有这种写法
获取内容:response.css('.articleGender::text')
获取属性:response.css('.author > a::attr(href)')
item如何使用
和字典用法一样,还可以快速的转化为字典
d = dict(baby)
5.yield item和请求
yield item
yield scrapy.Request(url=url, callback=self.parse)
yield scrapy.FormRequest(url=post_url, formdata=formdata, callback=self.parse_post)
文件方式启动scrapy
from scrapy import cmdline
cmdline.execute(['scrapy', 'crawl', 'qiubai'])
6.日志信息和错误等级
错误等级有5个级别,从高到低依次为
CRITICAL 严重错误
ERROR 一般错误
WARNING 警告
INFO 普通信息
DEBUG 调试信息
发现bug需要3s钟,解决bug需要3个小时,debug却需要一辈子
默认的级别是 DEBUG