欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习随笔 Scrapy爬虫框架

程序员文章站 2022-05-06 20:28:40
...

    网络爬虫原理就是获取网页返回,然后提取所需的内容。获取网页返回很简单,重点就在提取内容上。可以使用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