Scrapy入门:简单爬虫项目梳理整个框架操作流程
Scrapy入门
1. 准备工作
只需要安装 Scrapy 库即可,我实用的是 Pycharm 软件,安装的话只需要在菜单setting/project/project interpreter中添加第三包,搜索 scrapy 即可进行安装。
或简单粗暴:
pip install scrapy
2. 准备工作
2.1 创建项目
创建一个 Scrapy 项目,项目文件可以直接实用 scrapy 命令生成:
scrapy startproject 文件名称
这个命令在cmd命令中执行,如果提示权限问题,可以加 sudo 运行该命令。该命令可以直接执行,不管在那个路径下,但是我还是建议放在非系统盘下的指定常用的文件下,便于日后的分类和管理。文件的结构如下:
2.2 简单解释所创文件的结构
- scrapy_test (项目的名字)
- items.py (Item的定义,定义爬取的数据结构)
- middlewares.py (Middlewares的定义,定义爬取时的中间件)
- pipelines.py (Pipelines的定义,定义数据管道)
- settings.py (配置文件)
- spiders (放置 Spider 的文件夹,里面存放了 Spider 的实例)
3. 创建 Spider
Spider 是自己定义的类,Scrapy 用它来从网页里抓取内容,并解析抓取的结果。这个类提供的Spider类得继承scrapy.Spider,还要定义Spider的名称和起始的请求,以及怎样处理爬取后的结果的方法。
使用命令创建(小技巧,直接用Pycharm打开刚才所创建的项目,在下方的Terminal处执行命令):
scrapy genspider Spider名称 网站域名
# scrapy genspider quotes.toscrape.com
执行后spiders文件夹下多了一个quotes.py,他就是刚刚创建的Spider,内容如下:
import scrapy
class QuotesSpider(scrapy.Spider):
# 项目名 唯一 用来区分不同的 Spider
name = 'quotes'
# 允许爬取的域名 如果初始或后续的请求链接不是这个域名下的,则请求链接会被过滤掉
allowed_domains = ['quotes.toscrape.com']
# 包含了 Spider 在启动时爬取的url列表,初始请求是由它来定的
start_urls = ['http://quotes.toscrape.com/']
# 被调用时 start_url 里面的链接构成的请求完成下载执行后,返回的响应就会被作为唯一的参数传递给这个函数。
# 该方法负责解析返回的响应,提取数据或者进一步生成要处理的请求
def parse(self, response):
pass
里面所涉及的变量都有注释解释。
4. 分析目标网页和你所要爬取的内容
该网页用的是书中给出的网址
url = 'http://quotes.toscrape.com/'
该网页没有任何的反爬限制,即使你不更换请求头也可以进行源码的爬取,如下是网页的源码:
如源码所示,所要爬取的信息都封装在 class=“quote” 的 span 标签中,看其中具体的,我们所要提取便是 text,author,tag三个信息,源码过于简单,不再多的叙述…
5. 创建 Item
Item是保存爬取数据的容器,它的使用方法和字典类似。不过相比字典,Item多了额外的保护机制,可以避免拼写错误或者定义字段错误。
创建Item需要继承 scrapy.Item 类,并且定义类型为 scrapy.Field 的字段。由上分析源码得知爬取的内容有 text、author、tags。
定义Item:
6. 使用Item,重写Spider中parse()方法
7. 构造请求,使用回调函数实现连续抓取
上面的操作只能实现对初始请求队列的抓取,那么下一页的内容该如何抓取呢?分析网页源码:
可以看到,在网页的最下端有 Next 按钮,而它的源码便是下一页的网页链接,便通过这个按钮来构造下一个请求。
构造请求时要用到 scrapy.Request 。所需要传递两个参数时 url 和 callback
- url:请求链接
- callback:回调函数。回调函数 指定了该回调函数的请求完成之后,获取到响应后,引擎会将该响应作为参数传递给这个回调函数。其进行解析生成下一个请求
由于下一页的网页结构和第一页的相同,便可以接着使用 parse()函数进行解析,在 parse() 方法后追加如下代码便可实现回调函数,爬虫的循环,直至把该网站所有网页爬取完:
next = response.xpath('//li[@class="next"]/a/@href').extract_first()
url = response.urljoin(next)
# 两个参数 url 和 callback
# url : 请求链接
# callback : 回调函数 指定了该回调函数的请求完成之后,获取到响应后,引擎会将该响应作为参数传递给这个回调函数。其进行解析生成下一个请求
yield scrapy.Request(url=url,callback=self.parse)
8. 最终的 Spider
9. 运行整体架构
在下方的Terminal处执行命令:
scrapy crawl quotes
接下来就可看到运行的结果了(过长,只放两张截图):
10. 保存到文件
执行命令:
scrapy crawl -o quotes.json
# 保存为 json 文件格式
'''
更多的文件格式
quotes.jsonline
quotes.csv
quotes.xml
quotes.pickle
quotes.marshal
ftp://user:aaa@qq.com/path/to/quotes.csv
'''
11. 使用 Item Pipeline 进行数据的清洗
当然要将数据保存如数据库当中也得在这个文件中进行方法的重写。
'''
Item Pipeline 项目管道。当 Spider 中的Item对象生成后,会被自动送到 Item Pipeline 中进行处理
其作用:清理 HTML 数据;
验证爬取数据,检查爬取字段;
查重并丢弃重复的结果;
将爬取的结果保存到数据库。
实现 process_item() 方法,两个参数 item 和 spider (spider 实例)
'''
在 pipeline.py 中进行方法的重写:
以上就是Scrapy框架,从项目的创建到数据的爬取清洗的整个流程。
继续努力,加油!