学习随笔 Scrapy爬虫框架
网络爬虫原理就是获取网页返回,然后提取所需的内容。获取网页返回很简单,重点就在提取内容上。可以使用Python的re模块,简单网页用re模块提取可以将就,复杂一点的提取内容就麻烦了。
Scrapy提取数据有选择器seletors,选择器构建于lxml库上,通过特定的XPath或者CSS表达式来“选择”HTML文件中的内容。lxml库是python的一个html/xml解析并建立文档对象模型dom的库,lxml的特点是功能强大,性能也不错。
XPath是一门用来在XML文件中选择节点的语言,也可以用在HTML上。在XPath中有7种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。XML文档是被作为节点树来对待的,树的跟被称为文档节点或者根节点。如下xml文件中,<superhero>是文档节点,<name lang="en">Tony Stark</name>是元素节点,lang="en"是属性节点,Tony Stark是文本节点。
<superhero>
<class>
<name lang="en">Tony Stark</name>
<alias>Iron Man</alias>
<sex>male</sex>
<birthday>1969</birthday>
<age>49</age>
</class>
<class>
<name lang="en">Peter Benjamin Parker</name>
<alias>Spider Man</alias>
<sex>male</sex>
<birthday>unknow</birthday>
<age>unknow</age>
</class>
<class>
<name lang="en">Steven Rogers</name>
<alias>Captain America</alias>
<sex>male</sex>
<birthday>1920</birthday>
<age>98</age>
</class>
</superhero>
表达式 | 描述 |
---|---|
nodeName | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
* | 匹配任何元素节点 |
*@ | 匹配任何属性节点 |
Node() | 匹配任何类型的节点 |
XPath选择器还提供.re()方法,用于正则表达式提取数据。然而不同于使用.xpath()或者.css(),.re()方法返回的是unicode字符串的列表,无法构造嵌套式的.re()调用
简单写一个用XPath选择器来提取XML文件所需内容的代码:
from scrapy.selector import Selector
with open('./superHero.xml', 'r') as fp: # 打开xml文件
body = fp.read()
print(Selector(text=body).xpath('/*').extract()) # 提取根节点开始的任何元素节点
print(Selector(text=body).xpath('/html/body/superhero/class[1]').re('>.*?<'))
CSS层叠样式表是一门将HTML文档样式化的语言。CSS规则由两个主要的部分构成:选择器,以及一条或多条声明。列出CSS经常使用的几个选择器。
.class | .intro | 选择class="intro"的所有元素 |
#id | #firstname | 选择id="firstname"的所有元素 |
* | * | 选择所有元素 |
element | p | 选择所有<p>元素 |
element,element | div,p | 选择所有<div>元素和所有<p>元素 |
element element | div p | 选择<div>元素内部所有<p>元素 |
[attribute] | [target] | 选择带有target属性的所有元素 |
[attribute=value] | [target=_blank] | 选择target="_blank"的所有元素 |
from scrapy.selector import Selector
with open('./superHero.xml', 'r') as fp: # 打开xml文件
body = fp.read()
print(Selector(text=body).css('class name').extract()) # 提取根节点开始的任何元素节点
安装scrapy错误提示:Microsoft Visual C++ 14.0 is required...
http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载twisted对应版本的whl文件,cp后面是python版本,amd64代表64位,运行命令:pip install xxx.whl.安装完成后,再次运行:pip install scrapy
上一篇: 大管家笔试题(深圳)
下一篇: python爬虫scrapy框架