说明:文章是本人读了崔庆才的Python3---网络爬虫开发实战,作的简单整理,但愿能帮助正在学习的小伙伴~~
1. 准备工做:
安装Scrapy框架、MongoDB和PyMongo库,若是没有安装,google了解一下~~数据库
2. 建立项目:
使用命令建立Scrapy项目,命令以下:json
scrapy startproject tutorial网络
该命令能够在任意文件夹运行,若是提示权限问题,能够加sudo运行。该命令会建立一个名为tutorial的文件夹,结构以下:数据结构
# scrapy.cfg: Scrapy项目的配置文件,定义了项目的配置文件路径,部署相关信息等框架
# item.py: 定义item数据结构(爬取的数据结构)dom
# pipeline.py: 定义数据管道scrapy
# settings.py: 配置文件ide
# middlewares.py: 定义爬取时的中间件函数
# spiders: 放置Spiders的文件夹学习
3. 建立Spider:
Spider是本身定义的类,Scrapy用它来从网页抓取内容,并解析抓取结果。该类必须继承Scrapy提供的Spider类scrapy.Spider。
使用命令建立一个Spider,命令以下:
cd tutorial
scrapy genspider quotes quotes.toscrape.com
首先,进入刚才建立的tutorial文件夹,而后执行genspider命令。第一个参数是spider的名称,第二个参数是网络域名(要抓取网络的域名)。执行完毕后,spiders文件夹中多了一个quotes.py,它就是刚刚建立的Spider,内容以下:
该类中有三个属性 ------ name、allowed_domains、start_urls,一个方法parse。
# name,惟一的名字,用来区分不一样的Spider。
# allowed_domains,容许爬取的域名,若是初始或后续的请求连接不是该域名下的,则被过滤掉。
# start_urls,Spider在启动时爬取的url列表,用来定义初始的请求。
# parse,它是spider的一个方法,用来处理start_urls里面的请求返回的响应,该方法负责解析返回的响应,提取数据或进一步生成处理的请求。
4. 建立Item:
Item是保存爬取数据的容器,使用方法和字典相似。建立Item须要继承scrapy.Item类,而且定义类型为scrapy.Field的字段。
定义Item,将生成的items.py修改以下:
这里定义了三个字段,接下来爬取时咱们会用到这个Item。
5. 解析Response:
前面咱们看到,parse()方法的参数response是start_urls里面的连接爬取后的结果,因此在parse方法中,能够对response变量包含的内容进行解析。网页结构以下:
提取方式能够是CSS选择器或XPath选择器。在这里,使用CSS选择器,parse()方法修改以下:
首先,利用选择器选取全部的quote,并将其赋值给quotes变量,而后利用for循环对每个quote遍历,解析每个quote的内容。
对text来讲,他的class是text,因此用.text选择器来选取,这个结果其实是整个带有标签的节点,要获取它的正文内容,能够加::text来获取。这时的结果是长度为1的列表,因此还须要用extract_first()方法来获取第一个元素。
而对于tags来讲,因为咱们要获取全部的标签,因此用extract()方法来获取整个列表便可。
6. 使用Item:
上面定义了Item,这边咱们就须要用到它。Item能够理解为一个字典,不过在这里须要先实例化,而后将解析的结果赋值给Item的每个字段,最后返回Item。
修改QuotesSpider类以下:
至此,首页的全部内容被解析出来了,并将结果赋值给一个个TutorialItem。
7. 后续Request:
上面实现了网页首页的抓取解析,那么下一页怎么抓取呢?咱们能够看到网页的翻页结构以下:
这里有一个Next按钮,查看源码,能够看出下一页的全连接是:http://quotes.toscrape.com/page/2/,经过这个连接咱们就能够构造下一个请求。
构造请求须要用到scrapy.Request。这里会有两个参数 -------url和callback。
# url,请求连接。
# callback,回调函数。请求完毕后,获取响应,引擎会将该响应做为参数传递给回调函数,回调函数进行解析或生成下一个请求。
在parse()方法中追加以下代码:
第一句,获取下一个页面的连接,即要获取a超连接中的href属性。
第二句,调用urljoin()方法,urljoin()方法能够将相对URL构形成一个绝对URL。例如,获取获得下一页的地址是/page/2/,urljoin()方法处理后的结果是:http://quotes.toscrape.com/page/2/。
第三句,经过url和callback变量构造了一个新的请求,回调函数callback依然使用parse()方法。这样,爬虫就进入了一个循环,直到最后一页。
修改以后,整个Spider类以下:
8. 运行:
进入目录,运行以下命令:
scrapy crawl quotes
就能够看到Scrapy的运行结果了。
9. 保存到文件:
运行完Scrapy后,咱们只在控制台看到了输出结果。如何保存结果呢?
Scrapy提供了Feed Exports能够轻松将结果输出。例如,咱们想将上面的结果保存成JSON文件,能够执行以下命令:
scrapy crawl quotes -o quotes.json
命令运行后,会发现项目内多了一个quotes.json文件,这个文件包含了抓取的全部内容,格式为JSON。
另外,还支持其余格式以下:
scrapy crawl quotes -o quotes.jsonlines (scrapy crawl quotes -o quotes.jl , jl是jsonlines的缩写)
scrapy crawl quotes -o quotes.csv
scrapy crawl quotes -o quotes.xml
scrapy crawl quotes -o quotes.pickle
scrapy crawl quotes -o quotes.marshal
scrapy crawl quotes -o ftp://user:pass@ftp.example.com/path/to/quotes.csv (远程输出,须要正确配置,不然会报错)
10. 使用Pipeline:
若是想进行复杂额操做,如将结果保存到MongoDB数据库,或者筛选Item,咱们能够定义Pipeline来实现。
前面提到,Pipeline是项目管道,当Item生成后,它会自动被送到Pipeline进行处理,主要的操做以下:
# 清理HTML数据
# 验证爬取的数据,检查爬取的字段
# 查重并丢弃重复内容
# 将结果保存到数据库
实现Pipeline,只须要定义一个类并实现process_item()方法便可。启用Pipeline后,Pipline会自动调用这个方法。process_item()方法必须返回包含数据的字典或item对象,或者抛出DropItem异常。
process_item()方法有两个参数,一个参数是item,每次Spider生成的Item都会做为参数传递过来,另外一个参数是spider,就是Spider的实例。
接下来,咱们实现一个Pipline,筛掉text长度大于50的Item,并将结果保存到MongoDB数据库。
修改pipelines.py以下:
# from_crawler,这是一个类方法,用@classmethod标识,是一种依赖注入。它的参数就是crawler,经过crawler能够拿到全局配置的每个配置信息。在全局配置settings.py中,能够配置MONGO_UR和MONGO_DB来指定MongoDB链接须要的地址和数据库名称,拿到配置信息以后返回类对象便可。因此这个方法主要是用来获取settings.py中的配置信息。
# open_spider,当Spider开启时,这个方法被调用。进行初始化操做。
# close_spider,当Spider关闭时,这个方法被调用。将数据库链接关闭。
最主要的process_item()方法则进行了数据插入操做。
定义好的TutorialPipeline和MongoPipline这两个类后,咱们须要在settings.py中使用它们,MongoDB的链接信息也须要在settings.py中定义。
settings.py中加入以下内容:
赋值ITEM_PIPELINES字典,键名是Pipeline的类名称,键值是调用的优先级,是一个数字,数字越小对应的Pipeline越先被调用。
从新执行以下命令进行爬取:
scrapy crawl quotes
结束后,MongoDB中会建立了一个tutorial的数据库、TutorialItem的表,以下图:
11. 结语:
至此,一个简单的Scrapy框架爬虫就完成了,这只是一个简单的爬虫例子,想要了解更多,能够去看看崔庆才的书---------《Python3 网络爬虫开发实战》。
Github上面也有许多相关的项目能够去研究~~~