Scrapy安装,详细指令参数讲解及实战案例
- 1. Scrapy安装
- 1.1 安装模块
- 1.2 安装验证
- 2. Scrapy指令
- 2.1 如何查询指令
- 2.2 全局指令
- 2.2.1 fetch指令
- 2.2.2 shell指令
- 2.2.3 runspider指令
- 2.2.4 version和view指令
- 2.2.5 startproject指令
- 2.2.6 genspider指令
- 2.3 项目指令
- 2.3.1 bench指令
- 2.3.2 爬虫模板
- 2.3.3 check指令
- 2.3.4 list指令
- 2.3.5 crawl指令
- 2.3.6 edit指令
- 2.3.7 parse指令
- 2.3.8 settings指令
- 3. 爬取quotes网站
- 3.1 创建一个spider爬虫模板
- 3.2 对创建的文件进行操作
- 3.3 开始运行Scrapy
- 3.4 代码分析
- 3.5 Python中的文件存储
- 3.6 提取数据方法
- 3.7 分析网页,明确目标
- 3.8 实战解析
1. Scrapy安装
1.1 安装模块
安装的过程,会和自己python版本有关系,建议使用python3.7.3/3.7.4(自己使用的3.7.4这个版本),直接通过下面的指令在命令行中安装成功了,并没有出现报错信息
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy1.2 安装验证
安装完成后,可以在python中导入检测一下,执行代码如下,如果没有报错则证明安装成功
2. Scrapy指令
2.1 如何查询指令
Scrapy框架是通过命令行来执行了,要想了解Scrapy相关的指令可以打开命令行,然后输入scrapy -h进行指令查询(注意要退出之前用来验证安装成功的python环境,直接在系统默认路径下输入),如下,其中Scrapy指令又分为全局指令和项目指令
2.2 全局指令
通过scrapy -h查询到的命令,也就是上图的Available commands下面的几个指令均属于全局指令(在创建的项目外也可以使用的指令)
2.2.1 fetch指令
用于爬取网页,不依赖于项目,也就是不用创建一个项目,就可以直接爬取网页,并且可以显示爬取的过程,就类似我们正常写的爬虫
-h就是查看帮助的意思,那么也同样可以使用它查看fetch的使用方式(但注意基本的格式是scrapy fetch -h,对应上图的倒数二三行的内容),如下
注意Usage下面核心的三行提示,介绍了fetch指令的使用,还有一个常用的参数,就是--nolog,不显示日志信息,其余的options和global options都是可选的参数比如使用fetch指令爬取百度首页,运行如下,下面带有时间和之后的输出都是属于爬取过程中的日志信息
在日志信息最下面会出现请求爬取的网页信息,如下
那么就有一个问题,这么长长的爬取日志的信息,不想让它显示出来,就可以设置前面提到的--nolog参数,这里有个方便之处,不需要重新输入刚刚的指令,只需要在命令行按一下“up”键(就是上下左右的上键)就可以出现刚刚输入的指令,然后在后面输入--nolog即可
如果是爬取笑话大全,是会有问题的,需要设置具体的爬取参数才可以进行网页信息的获取
综上:可以看出直接通过fetch是可以查看一个网页的状态以及返回的结果,但是要实现url网页中提取内容,就需要下面有关的指令了
2.2.2 shell指令
描述为: Interactive scraping console(交互式的爬取过程控制台),主要是调试和开发时候使用,这里还是以爬取百度网页为例
比如查看返回内容,在交互式的环境下直接输入response.text就可以获得请求的网页的信息
那么就可以直接进行数据的获取了,如下。
2.2.3 runspider指令
其对应的描述就是Run a self-contained spider (without creating a project),翻译过来就是:可以独立的运行一个爬虫的文件,而不需要创建一个项目(项目中可以包含一个或者多个爬虫文件)
具体操作:首先是要创建一个py文件,比如创建在桌面,命名为demo.py,然后书写代码如下(这里可以先按照下面的敲,至于为什么,之后介绍项目的时候就自然明白了)
from scrapy.spiders import Spider #需要导入这个爬虫基类class DemoSpider(Spider): #继承基类
name = 'Demo' #定一个名称
allowed_domains = ['baidu.com'] #这里写域名
start_urls = ['http://www.baidu.com'] #这里写网址
def parse(self,response): #定义处理函数
print('测试......')
print('成功运行单个文件')
print('恭喜!!!')
代码写完之后保存,然后在命令行中执行如下。注意:这里易错的地方在于没有把路径指引到py文件所在的路径下,因此会导致运行出错(比如这里创建的demo.py文件是在桌面的,运行的时候就需要把路径指引到桌面,再运行指令)
2.2.4 version和view指令
version指令:就是参看当前scrapy的版本信息,如下
view指令:使用Scrapy获取URL下载页面并在浏览器中显示其内容,比如输入如下指令系统会调用默认浏览器,然后打开目标网址(这里还是以百度为例)
2.2.5 startproject指令
用来创建爬虫项目的,如何使用也可以通过-h来查询,先介绍一下scrapy的工作基本流程总共有五部分组成的,具体的流程可看图示
1) 项目包含
引擎、调度器、下载器、蜘蛛和项目管道
2)爬取流程
针对于每个URL,
Scheduler -> Downloader -> Spider ->
① 如果返回的是新的URL,就会返回Scheduler
② 如果是需要保存的数据,则会被放到item pipeline里面
接下来就进行实际操作
3) 操作实例
① 首先进入要存放代码的目录(命令行窗口下)
② 然后输入scrapy startproject tutorial
③ 查看目录结构在指定目录下创建了一个文件夹(比如自己的桌面路径C:\Users\86177\demo),查看一下文件目录的结构,可以看到该文件夹下一共两个文件(一个是tutorial文件夹,一个是scrapy.cfg配置文件),该文件夹的具体文件如下
scrapy.cfg配置文件是将我们的项目发布到网上去时要进行的设置内容,一般情况下是使用不到的,我们大多情况下接触到的还是tutorial下的文件
spiders文件夹是刚刚命令行窗口下的第二个选项对应的文件存储路径,也就是在运行’scrapy genspider example examplam.com’时,会在spiders文件夹里面创建一个爬虫模板
–init–.py文件是一个声明文件,说明当前创建的这个文件夹是一个包(关于Python的包、库、模块,这里不进行介绍,可自行了解)
items.py文件是要存储要爬取的东西
middlewares.py文件是在下载完东西后需要通过的一个过程(中转站)
pipelines.py文件就是items下载完毕之后的通道
settings.py文件使用来写scrapy项目的配置
2.2.6 genspider指令
其描述为: Generate new spider using pre-defined templates (使用预定义的模板来进行爬虫),也就是需要通过项目指令来指定具体的可用模板,后面结合这项目指令进行讲解,这里就不加赘述了
2.3 项目指令
去除掉以上介绍的指令,还有两个指令(bench和settings),放在项目指令中讲解。以刚刚创建的tutorial项目为例,进入项目文件路径后,再次调用scrapy -h指令,可以看到项目指令如下
其中多了check、crawl、edit、list、parse五个项目指令,再配合刚刚的两个指令,下面详细讲解这7个指令
2.3.1 bench指令
bench指令可以测试本地计算机硬件的性能,在使用scrapy bench指令后,系统就会创建一个本地的服务器,并且会以最大的速度进行爬取,不进行网页具体的爬取,只是进行网页的跟进,测试的速度是每分钟可以爬取多少网页
比如自己的计算机,最大的爬取速度为每分钟5160页,由此可以查看一下自己计算机爬取的网页的速度,每分钟可以爬取的页数越多,计算机的性能也就越优异
2.3.2 爬虫模板
爬虫项目文件创建之后,会发现在spiders文件夹中除了一个初始化执行文件以外并没有其他的文件了,因此需要创建爬虫的文件,也就要使用到genspider指令,首先查看一下可用的模板信息,如下
查看爬虫模板的指令:scrapy genspider -l(l就是list的意思)
第一个basic就是最基本的爬虫模板,第二个crawl是自动化爬虫模板,第三和第四是针对csv和xml文件
1) basic模板
执行代码如下,其中quotes是爬虫模板的文件名,后面的quotes.toscrape.com是网址的域名不是网址(关于网址和域名的关系)
这时候在spiders文件夹下就多了一个quotes.py文件,如下
打开文件后,就会有中熟悉的感觉,是不是和之前运行单个爬虫文件几乎一致,就是类的名称不同
2) crawl自动化模板就是在创建的时候,将-t后面的basic修改为crawl即可,然后打开创建的爬虫文件,如下(多了自动化爬取的规则)
3) csvfeed模板
将对应指令修改为csvfeed,生成的爬虫模板文件为
4) xmlfeed自动化模板
和上面的操作类似,生成的模板文件如下
2.3.3 check指令
用来检测爬虫文件是否能正常运行,后面输入要测试的爬虫文件的名称即可(去掉.py)
比如拿刚刚创建的四个模板举例,其中第四个爬虫模板文件,有意的把第一行导入模块的代码删除,可以发现最后程序检测失败,并给出报错的详细信息
2.3.4 list指令
显示当前项目中可执行的爬虫模板文件(可执行表示存在,但是不保证能正常运行),如下
2.3.5 crawl指令
和runspider指令的功能一样,也是运行代码文件,但是这里执行的是项目中的爬虫模板文件。具体的操作如下
为了可视化输出,来验证程序可以正常运行,这里直接在parse函数下面添加输出语句即可(四个模板里面都写),最后的输出结果如下
由结果可知,在没有进行任何爬取信息的设置下,只进行单纯的print的语句输出,可以正常运行出结果的文件是quotes.py,而其对应的模板为basic,所以最基本的模板保证了爬虫文件的可执行性,而其他的三个模板都需要进行相关参数的设置才可以进行最终数据的输出
2.3.6 edit指令
该指令是在linux系统下可运行,功能是打开某个爬虫文件,然后使用编辑器进行编辑,在windows系统中是无法运行的,功能说明和执行代码结果如下
2.3.7 parse指令
使用该指令可以指定一个爬虫文件进行某个网址的爬取,一般就是这个爬虫文件的网址,如下
具体其他的参数可以通过scrapy parse -h参看,如下
2.3.8 settings指令
用于查看设置的相关参数,可以打开项目的settings.py文件,获取其中的值对应的数据,没有注释的都可以获取,注释的内容有部分获取为None(即便是取消注释了)
其他的参数使用可以通过scrapy settings -h指令查询,如下
3. 爬取quotes网站
名言网站,界面如下
3.1 创建一个spider爬虫模板
在项目根目录运行如下代码,这里就是创建最简单的basic,不输入的话就是默认
scrapy genspider quotes quotes.toscrape.com回车确定后输出如下内容
这时候就会在spider文件夹里自动生成如下文件
其中name 就对应命令行窗口创建时候网站前面的那个单词的名称,start_urls里面就是要爬取的网站(网址),allowed_domains要求是在主域名下进行爬取信息
3.2 对创建的文件进行操作
比如这里对前两页的信息进行爬取
import scrapyclass QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/']
def parse(self, response):
page = response.url.split("/")[-2]
file_name = "quote-{}.html".format(page)
with open(file_name, "wb") as f:
f.write(response.body)
self.log("Saved file {}".format(file_name))
3.3 开始运行Scrapy
一定是要在根目录下面输入如下代码(在上面的示例中就是tutorials/),否则系统就会报错
scrapy crawl quotes试着运行一下,运行之前记得保存一下qutoes.py文件,也就是刚刚编辑代码的那个窗口文件(如果有错误一般会在中间进行提示,会有各种Error提醒),没有错误时就顺利完成创建
这时候本地就会多出来两个文件夹,里面就包含了我们要爬取网站的源代码(也就是在start_urls包含的网址),如下
其中的quote-1.html的开头源代码如下
3.4 代码分析
列表倒数元素的获取方法
page = response.url.split("/")[-2]列表中的负数表示倒数,比如下面的列子
s = 'hello world!'print(s[-2])
–> 输出结果为:d
所以对于有规律的网站(网址)要提取里面的信息就很简单
s = 'http://quotes.toscrape.com/page/1/'print(s.split('/')[-2])
–> 输出结果为:1
因此可以使用这种方式获取页码page
3.5 Python中的文件存储
with open(file_name, "wb") as f:f.write(response.body)
使用的方式就如下:
with open(文件名, "wb") as f:f.write(文件内容)
举个栗子:
with open('hello.txt', "w") as f:f.write('hello world!')
–> 输出结果为:
或者使用如下:注意和上面的区别
f.write('hello world!'.encode())
–> 输出结果为:和上方的输出是一样的
注意事项: 不同的spider的name不能相同(容易理解,因为创建的时候会在spider文件夹里创建文件,一山不容二虎),里面的函数名称不能自己随意命名
3.6 提取数据方法
打开cmd窗口,切换到下载文件的目录里面(这里推荐使用powershell,在目标文件所在目录空白位置同时按住shift和鼠标右键就可以打开,这样不用再切换路径了,powershell和cmd的区别),输入
scrapy shell 'http://quotes.toscrape.com/page/2/'就会进入交互模式,如下
比如我们想获取网页里面的title,就可以使用CSS选择器,通过response.css(‘title’),进行输出,如果要输出标签信息的话,后哦面还需要加上.extract()方法,返回的是一个列表
获取标签里面的内容,注意不是和原来一样将.text放在最后面,而是在中间了
Scrapy也支持xpath进行文本提取(关于xpath会在爬虫专项里面进行讲解),代码执行结果如下
3.7 分析网页,明确目标
打来目标页面,进行检查,找到对应的标签信息
3.8 实战解析
这时候已经确定标签对应目标信息的位置,接下来打开quotes.py文件,进行代码编写
首先 获取该页面的全部的正文内容(就是quote,里面的名言)
quotes = response.css(".quote")–> 输出结果,可以看出一个页面是有10条数据,如下
其次 再获取每一个正文里面的文本内容、作者和对应的标签
for quote in quotes:title = quote.css('.text::text').extract()[0]
author = quote.css('.author::text').extract()[0]
tags = quote.css('.tag::text').extract()
print('title:\n',title)
print('author:\n',author)
print('tags:\n',tags)
然后 保存文件,quotes.py文件里面最终的代码如下
import scrapyclass QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/']
def parse(self, response):
quotes = response.css(".quote")
for quote in quotes:
title = quote.css('.text::text').extract()[0]
author = quote.css('.author::text').extract()[0]
tags = quote.css('.tag::text').extract()
print('title:\n',title)
print('author:\n',author)
print('tags:\n',tags)
最后 打开命令行窗口(powershell或者cmd),在根目录下也就时tutarial文件夹路径,运行scrapy项目,输入之前的命令代码,如下
scrapy crawl quotes在命令行下面输入指令
–> 输出结果:(在全部输出内容的中间部分,和报错产生的位置是一样的)
最后的最后 把获取的数据存储到本地
import scrapyclass QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/']
def parse(self, response):
page = response.url.split("/")[-2]
file_name = "quotes-{}.txt".format(page)
with open(file_name,'w') as f:
quotes = response.css(".quote")
for quote in quotes:
title = quote.css('.text::text').extract()[0]
author = quote.css('.author::text').extract()[0]
tags = quote.css('.tag::text').extract()
print('title:\n',title)
print('author:\n',author)
print('tags:\n',tags)
f.write('title:{}\n author:{}\n tags:{}\n'.format(title,author,tags))
保存一下,然后在命令行窗口下运行指令scrapy crawl quotes,最后在根目录下会生成两个.txt文件,如下
quote1.txt里面的内容就对应着网站第一页的内容,如下
至此,第一个Scrapy项目完结了