Scrapy了解
Scrapy是一个优秀的开源爬虫框架:
- 开源:代表整个爬虫框架的源码都进行了公布,所有人均可查看,修改,维护
- 框架:整个Scrapy由多个常用的爬虫功能组成,只需要填写一些基础的爬虫信息,即可以实现异步爬虫
Scrapy优势
- Scrapy使用了Twisted模块实现了异步,使我们的爬虫更加稳定,效率更高
- 配置和功能拓展性都很灵活
- 有自带的常用功能和组件,可以快速实现开发
Scrapy工作流程
简易化:
| 名称 | 介绍 |
|---|---|
| 引擎(engine) | scrapy的核⼼,所有模块的衔接,对数据流程进⾏梳理 |
| 调度器(scheduler) | 可以看成是⼀个队列,⾥⾯存放着⼀堆即将发送的请求,它决定了下⼀步要去爬 取哪⼀个url |
| 下载器(downloader) | 它是⽤来发动请求的⼀个模块,完全可以把它理解成是⼀个requests.get()的功能 |
| 爬⾍(spider) | 这是我们要写的第⼀个部分,负责解析下载器返回的response对象,提取到我们需要的数据 |
| 管道(Item pipeline) | 这是我们要写的第⼆个部分的内容,主要负责数据的存储和各种持久化操作 |
| 下载中间件(downloader Middlewares) | 可以⾃定义的下载扩展,⽐如设置代理,处理引擎与下载器之间的请求与响应 |
| 爬⾍中间件(Spider Middlewares) | 可以⾃定义requests请求和进⾏response过滤 |
工作流程:
- 传⼊我们需要获取的链接列表。
- 引擎负责传输给调度器,他的任务是封装请求对象,传⼊队列,将请求对象返回给引擎。
- 引擎获取请求对象,给下载器,下载器负责从⽹络下载进⾏请求下载,最终将响应数据返回给引擎。
- 引擎将响应数据返回给我们后,可以对其进⾏数据解析,将解析的数据进⾏存储,如果还有新的链 接需要获取可以继续将链接返回给引擎,再次执⾏上述整个流程
- 引擎接收到需要存储的数据,将数据给管道进⾏存储,管道可以将数据存储到本地的⽂件或者数据库
我们需要做的 1.给出需要爬取的链接 2.将返回的响应对象进行解析 3.写如何存储
Scrapy安装
# 更新 pip
python -m pip install --upgrade pip
#安装scrapy
pip install -U scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
Scrapy基础使用
在新的项目中创建一个Scrapy框架
1.进入到需要创建框架的路径
cd 相对路径或者绝对路径
相对路径:cd python # 表⽰进⼊当前⽬录下的python⽂件夹
绝对路径:cd /d F:/music/ # 表⽰进⼊F盘的music⽂件夹,/d 参数代表切换驱动盘
返回上一级:cd ../ # 代表返回⽬录,如果需要返回多级,则可以在后⾯继续加../
2.创建项目
scrapy startproject baidu #baidu 为爬虫框架的名称,根据网站名称自定义即可
主要文件介绍
spiders⽂件夹:是我们存放爬⾍的位置
items.py:是数据封装的地⽅,⽤于设定存储时候的字段
middlewares.py:中间件(爬⾍中间件和下载中间件)
pipelines.py:管道,设置如何保存数据
settings.py:Scrapy的配置项,设置⼀些基础信息
**3.创建爬虫
通过cd命令进入到spiders目录
#创建爬虫文件
scrapy genspider baidu baidu.com(或者www.baidu.com)
创建完成之后,我们的spider就出现了
import scrapy
class BaiduSpider(scrapy.Spider):
name = "baidu" # 爬⾍的名称
# 爬⾍的域名范围,请求的链接中都需要包含这个域名,如果有新的域名可以添加到列表中
allowed_domains = ["www.baidu.com"]
# 起始获取的链接,⽹址会⾃动进⾏补全,但是可能补全不对,我们需要进⾏修改
start_urls = ["https://www.baidu.com"]
def parse(self, response):
pass # ⽤于解析数据
运行爬虫
scrapy crawl baidu baidu:执⾏的爬⾍程序的名字
可以通过创建文件来启动,例如start.py⽂件执⾏爬⾍项⽬:
from scrapy import cmdline
cmdline.execute("scrapy crawl baidu".split()) #执⾏的命令是⼀个列表,这⾥⽤split进⾏分割
#或者cmdline.execute(["scrapy","crawl","baidu"])