在上一节中,咱们已经建立好了咱们的scrapy项目,看着这一大堆文件,想必不少人都会一脸懵逼,咱们应该怎么启动这个爬虫呢?html
既然咱们采用cmd命令建立了scrapy爬虫,那就得善始善终有逼格,咱们仍然采用程序员的正统方式——cmd的方式运行它前端
scrapy crawl jobbole
当咱们在cmd中输入这条命令后,咱们的爬虫也就开始运行了。可是若是每次都须要这样才能启动,不只费时费力,也难以在IDE中调试程序。面对这种状况,咱们能够采起使用python来实现自动命令行的启动。好吧,真香!java
因而咱们在咱们的项目中建立一个main.py文件python
编写如下代码程序员
# Author :Albert Shen # -*- coding: utf-8 -*- from scrapy.cmdline import execute import sys import os if __name__ == '__main__': sys.path.append(os.path.dirname(os.path.abspath(__file__))) execute(["scrapy", "crawl", "jobbole"])
运行main.py,咱们就会发现,scrapy成功开始运行,并将运行结果输出到了console窗口,此时咱们也就能够充分利用IDE的优点,进行便捷的调试与运行。正则表达式
既然咱们的爬虫已经能够运行了,那么应该如何编写逻辑才能爬取到咱们想要的数据呢?编程
首先咱们打一个断点后端
此时你们注意response对象的text变量,看起来是否很像网页的html代码。为了确认这个猜想是否正确,咱们能够将text变量的值复制出来,拷贝到一个html文件中,打开发现确实是目标网页的html源代码。浏览器
这是由于当程序开始运行,scrapy获取网页数据后,调用了此文件中的parse函数,同时将获取到的数据传递给了resposne参数。这正是scrapy框架的强大之处,将前面一系列与目标网页相关的操做进行了封装,咱们只须要关心怎么从网页源代码中得到想要的信息便可,因此咱们后续的操做将主要围绕这response参数来进行。app
若是你们尝试一些其余网页,可能会出现得到的网页与咱们想要的网页不一样的状况,这可能是由于目标网页须要登陆验证或采起了反爬虫策略,这一部分咱们将在后续的文章中涉及。
既然咱们已经得到了网页的源代码,那么咱们应该怎么解析数据呢?可能细心的读者会注意到response.text的值是一个字符串,那么采用正则表达式不失为一种可靠的方式。可是做为一个成熟的爬虫框架,scrapy为咱们提供了一种更加简便准确的方式——xpath。将咱们的jobbole.py文件修改成这样
# -*- coding: utf-8 -*- import scrapy class JobboleSpider(scrapy.Spider): name = 'jobbole' allowed_domains = ['blog.jobbole.com'] start_urls = ['http://blog.jobbole.com/all-posts/'] def parse(self, response): articles = response.xpath('//a[@class="archive-title"]/text()').extract() print(articles) pass
运行程序,打断点调试,咱们发现,articles变量是一个list,包含20个字符串,正好就是目标网页的20篇文章的标题。经过一行即能实现精确的目标数据提取,正是依靠xpath。
在学习xpath以前,读者最好能对前端,尤为是HTML语言有必定了解,至少须要知道一些基本的概念。
HTML语言是一种超级文本标记语言,与后端的C,java,python等不一样,HTML不是编程语言,而是标记语言,是经过一系列标签来描述网页。若是对此没有概念的读者能够简单的将其理解为HTML语言是经过一句句话告诉浏览器,首先我在这要放一段文字,而后要在这那一张图片等等,相似于画图。
HTML标记标签一般被称为HTML标签。是由尖括号<>包围的关键字,如<html>,<h1></h1>等。标签之间的部分被称为元素,同时每一个标签也有属性,例如
<a href="http://www.w3school.com.cn">This is a link</a>
其中<a></a>标签表示这是一个连接,This is a link 是显示给阅读者的字符,href是它的一个属性,表示目标网址是http://www.w3school.com.cn。真实的显示效果以下图所示
点击它就能跳转到目标网页。
若是想要深刻的了解HTML的知识,能够在w3school上进行学习:http://www.w3school.com.cn/
xpath正是基于此的。经常使用的xpath语法以下图所示(来源:w3school)
w3school关于xpath的教程:http://www.w3school.com.cn/xpath/index.asp
举一些例子
你们若是想要深刻了解xpath,也建议到w3school进行进一步学习。若是对前端实在不熟悉的读者,也能够跟着笔者这个系列的教程,相信通过一段时间的练习,也可以熟练掌握相关知识。
有了上面的知识,咱们来分析一下咱们是怎么获得目标网页的全部标题的呢?
在浏览器中打开目标网页http://blog.jobbole.com/all-posts/,按f12(Chrome浏览器)打开开发者工具
1.咱们能够在想要查看的元素处右击,选择“检查”
2.在开发者攻击中点击2位置的图标,而后点击咱们想要查看的元素
Chrome就会自动跳转到目标元素的源代码处。
<a class="archive-title" target="_blank" href="http://blog.jobbole.com/114331/" title="受 SQLite 多年青睐,C 语言到底好在哪儿?">受 SQLite 多年青睐,C 语言到底好在哪儿?</a>
目标元素几个比较重要的信息为
1.这是一个<a></a> (连接)
2.目标元素包含多个属性,其中一个属性为class,值为archive-title,一个属性为href,值为点击这个标题将会跳转的目标网页的网址
3.包含一个属性为title,其值与标签之间的“元素”值相同。
articles = response.xpath('//a[@class="archive-title"]/text()').extract()
咱们上述代码中的 //a[@class="archive-title"] 表示取整个文档中全部( // 表示整个文档中的全部节点)包含class属性(中括号[]表示对前面标签的限制,如包含什么属性),且属性值为“archive-title”的a节点(标签)。
咱们能够搜索网页的全部代码,就会发现全部包含 archive-title 字符串的只有20处,正好是本页全部文章的标题<a></a> 标签的class属性值,也就是说咱们仅凭这一句话就精确地选到了咱们想要的数据。
/text()表示咱们想要得到这些标签的“元素”值(即标签之间的内容,也就是会在网页上显示出来的内容),若是想要得到标签的某个属性值,如href,则可使用以下语句
response.xpath('//a[@class="archive-title"]/@href').extract()
由于咱们取的是属性,因此必定不要忘了@来表示属性,若是没有a,则会认为是目标a标签下的href标签,显然是错误的。
extract()表示得到 提取出来的数据的data变量,即咱们指定的标签中的内容。若是以为这一句难以理解,读者也能够将程序中的.extract()删除,观察结果。
彩蛋:在开发者工具中,右击源代码,咱们能够选择复制目标标签的xpath。同理,因为动态网页等缘由,这种方式得到的xpath可能与scrapy得到的网页不匹配。这种方式能够帮助你们更深刻的理解xpath,但在后续的编程过程当中,笔者仍是建议你们本身进行分析。
As Albert says: 既然写程序是为了偷懒,那写程序的时候就不要偷懒了。
在这一节中,咱们了解了如何快捷地启动scrapy,xpath基本语法,并尝试进行了scrapy爬虫的初次尝试。在后面的章节中,咱们将会对整篇网页进行解析,并采用深度优先搜索遍历jobbole的全部文章,解析数据,下载封面图等。同时咱们将使用到正则表达式以分析字符串来得到咱们想要的数据,因为篇幅限制,笔者将不会对正则表达式进行详细介绍,建议你们提早了解一些正则表达式的基本知识。