运行Scrapy爬取网页的数据信息
Scrapy中解析Response
前面我们看到,parse()方法的参数是response是start_urls里面的链接爬取后的结果。所以在parse()方法中,我们可以直接对response变量包含的内容进行解析,比如浏览请求结果的网页源代码,或者进一步分析源代码内容,或者找出结果中的链接而得到下一个请求。
我们可以看到网页中既有我们想要的结果,又有下一页的链接,这两部分内容我们都要进行处理。
首先看看网页结构,每一页都有多个class为quote的区块,每个区块内都包含text、author、tags。那么我们先找出所有的quote,然后提取每一个quote中的内容。
提取的方式可以是CSS选择器或XPath选择器。在这里我们使用CSS选择器进行选择,parse()方法的改写如下所示:
这里首先利用选择器选取所有的quote,并将其赋值为quotes变量,然后利用for循环对每个quote遍历,解析每个quote的内容。
对text来说,观察到它的class为text,所以可以用.text选择器来选取,这个结果实际上是整个带有标签的节点,要获取它的正文内容,可以加::text来获取。这时的结果是长度为1的列表,所以还需要用extract_first()方法来获取第一个元素。而对于tags来说,由于我们要获取所有的标签,所以用extract()方法获取整个列表即可。
使用Item
上文定义了Item,接下来就要使用它了。Item可以理解为一个字典,不过在声明的时候需要实例化。然后依次用刚才解析的结果赋值item的每一个字段,最后将Item返回即可。
QuotesSpider的改写如下所示:
如此一来,首页的所有内容被解析出来,并被赋值成了一个个QuoteItem。
后续Requests
上面的操作实现了从初始页面抓取内容。那么,下一页的内容该如何抓取?这就需要我们从当前页面中找到信息来生成下一个请求,然后在下一个请求的页面里找到信息再构造再下一个请求。这样循环往复迭代,从而实现整个网站的爬取。
将刚才的页面拉到最底部,如下所示:
这里有一个Next按钮。查看一下它的源代码,可以发现它的链接是/page/2/,所以全链接应该如下所示:
通过这个链接我们就可以构造下一个请求。
构造请求时需要用到scrapy.Request。这里我们传递两个参数——url和callback,这两个参数说明如下:
url:它是请求链接callback:它是回调函数。当指定了该回调函数的请求完成之后,获取到响应,引擎会将该响应作为参数传递给这个回调函数。回调函数进行解析或生成下一个请求,回调函数如下文的parse()所示。由于parse()就是解析text、author、tags的方法,而下一页的结构和刚才已经解析的页面结构是一样的,所以我们可以再次使用parse()方法来做页面解析。
接下来我们要做的就是利用选择器得到下一页链接并生成请求,在parse()方法后追加如下代码:
运行
接下来,我们就可以打开terminal进行运行命令啦,命令如下:
scrapycrawlquotes
就可以看到Scrapy的运行结果了:
首先Scrapy输出了当前的版本号以及正在启动的项目名称。接着输出了当前settings.py中一些重写的配置。然后输出了当前所应用的Middlewares和Pipelines。Middlewares默认是启用的,可以在settings.py中修改。Pipelins默认为空,同样也可以在settings.py中配置。
接下来就是输出各个页面的抓取结果了,可以看到爬虫一边解析一边翻页,最后将所有内容抓取完毕,然后停止。
最后,Scrapy输出了整个抓取过程的统计信息,这样整个Scrapy程序就成功运行啦,下一节我们将其存到MongoDB数据库中。
- 上一篇文章: 探索医药招商网突破的关键点,药品保健品的
- 下一篇文章: 没有了