简单使用
简介
Scrapy 是一个为了爬取网站信息,提取结构性数据而编写的应用框架,可以用于数据挖掘、检测和自动化测试。
架构
-
组件
- ·引擎,指挥其他组件协同工作
- 调度器 ,接收引擎发过来的请求,按照先后顺序,压入队列中,同时去除重复的请求
- 下载器,用于下载网页内容,并将网页内容返回给爬虫
- 爬虫,用于从特定网页中提取需要的信息
- 项目管道,负责处理爬虫从网页中抽取的实体,主要的功能是持久化、验证实体的有效性、清除不需要的信息
- 下载器中间件,介于引擎和下载器之间,主要处理
Scrapy
引擎与下载器之间的请求及响应 - 爬虫中间件,介于引擎和爬虫之间,主要工作是处理爬虫的响应输入和请求输出
-
数据流
简单使用
爬取 起点中文网月票榜 的小说名称、作者、类型
安装
pip install scrapy
创建项目
scrapy startproject qidian_yuepiao
目录结构
实现
在spiders
目录下创建爬虫源文件qidian_yuepiao_spider.py
scrapy genspider dingdian_xuanhuan https://www.xiaoshuopu.com/
其中scrapy genspider
创建爬虫的命令,dingdian_xuanhuan
爬虫名称,https://www.xiaoshuopu.com/
要爬取的网站
想爬取起点的,但是有反爬,改成爬取 https://www.xiaoshuopu.com/class_1/
import scrapy
class DingdianXuanhuanSpider(scrapy.Spider):
# 爬虫名称
name = "dingdian_xuanhuan"
# 允许的域名
allowed_domains = ["www.xiaoshuopu.com"]
# 起始URL列表
start_urls = ["https://www.xiaoshuopu.com/class_1/"]
def parse(self, response):
# 小说列表
novel_list = response.xpath("//table/tr[@bgcolor='#FFFFFF']")
print("小说数量是:", len(novel_list))
# 循环获取小说名称、最新章节、作者、字数、更新、状态
for novel in novel_list:
# 小说名称
name = novel.xpath("./td[1]/a[2]/text()").extract_first()
# 最新章节
new_chapter = novel.xpath("./td[2]/a/text()").extract_first()
# 作者
author = novel.xpath("./td[3]/text()").extract_first()
# 字数
word_count = novel.xpath("./td[4]/text()").extract_first()
# 更新
update_time = novel.xpath("./td[5]/text()").extract_first()
# 状态
status = novel.xpath("./td[6]/text()").extract_first()
# 将小说内容保存到字典中
novel_info = {
"name": name,
"new_chapter": new_chapter,
"author": author,
"word_count": word_count,
"update_time": update_time,
"status": status
}
print("小说信息:",novel_info)
# 使用yield返回数据
yield novel_info
scrapy crawl dingdian_xuanhuan -o 玄幻.json
scrapy crawl
爬虫的运行命令,dingdian_xuanhuan
爬虫的名称,-o 玄幻.json
输出格式,这个可以省略
支持的输出格式有:'json', 'jsonlines', 'jsonl', 'jl', 'csv', 'xml', 'marshal', 'pickle'
为什么使用yield返回数据
- 内存效率
- 节省内存:当处理大量数据时,如果直接将所有数据存储在列表或其他容器中再一次性返回,可能会消耗大量的内存。而使用 yield 可以逐个生成和处理数据项,这样可以大大减少内存的占用。
- 按需生成:生成器只在需要的时候生成下一个值,这使得程序更加高效,尤其是在处理大数据集时。
- 并发性和异步处理
- 非阻塞:Scrapy 是基于 Twisted 异步网络库构建的,支持并发请求。使用 yield 可以使爬虫在等待某个请求响应时去处理其他任务,从而提高抓取效率。
- 事件驱动:Scrapy 使用事件循环来管理多个请求和响应,yield 语句可以暂停当前函数的执行,让出控制权给事件循环,这样可以实现高效的异步操作。
- 数据流处理
- 管道化处理:在 Scrapy 中,你可以通过 yield 将数据传递到 Item Pipeline 进行进一步处理(如清洗、验证、存储等)。这种方式使得数据处理流程更加模块化和灵活。
xpath语法
简介
xpath
是一门在xml
文档中查找信息的语言。html
与xml
结构类似,因此也可以用在html
中
常用路径表达式
表达式 | 描述 | 示例 |
---|---|---|
节点名称 | 选取此节点的所有子节点 | div,p,h1 |
/ | 从根节点选取(描述绝对路径) | /html |
// | 不考虑位置,选取页面中所有子孙节点 | //div |
. | 选取当前节点 | ./div |
.. | 选取当前节点的父节点 | h1/…/ |
@属性名 | 选取属性的值 | @href |
text() | 获取元素中的文本节点 | //h1/text() |
示例
获取html元素
xpath("/html")
获取网页编码格式
xpath("//meta/@charset")
获取div的id属性值
xpath("//div/@id")
获取属性id为abc的div元素
xpath("//div[@id='abc']")
获取所有带有class属性的div元素
xpath("//div[@class]")
获取div节点中第一个p元素的文本
xpath("//div/p[1]/text()")
获取div节点中最后一个p元素的文本
xpath("//div/p[last()]/text()")