学习随笔 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经常使用的几个选择器。

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"的所有元素
 简单写一个用CSS选择器来提取XML文件所需内容的代码:
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

猜你喜欢

转载自blog.csdn.net/hongchen37/article/details/80405286