Scrapy入门教程

来源:互联网 发布:乐谱软件下载 编辑:程序博客网 时间:2024/05/24 01:56

本文参考Scrapy Tutorial里面的文档,翻译出来加上自己的理解,供大家学习。

在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容,这一切在Scrapy框架内实现将是很简单轻松的事情。

本教程主要内容包括一下四步:

1. 创建一个新的Scrapy Project
2. 定义你需要从网页中提取的元素Item
3. 实现一个Spider类,通过接口完成爬取URL和提取Item的功能
4. 实现一个Item PipeLine类,完成Item的存储功能

新建工程

首先,为我们的爬虫新建一个工程,首先进入一个目录(任意一个我们用来保存代码的目录),执行:

1
[python] view plaincopy
  1. scrapy startproject Domz  

最后的Domz就是项目名称。这个命令会在当前目录下创建一个新目录Domz,结构如下:

123456789
[cpp] view plaincopy
  1. dmoz<span style="color:rgb(0,0,64)">/</span>  
  2.    scrapy.<span style="color:rgb(0,119,136)">cfg</span>     
  3.    dmoz<span style="color:rgb(0,0,64)">/</span>  
  4.        __init__.<span style="color:rgb(0,119,136)">py</span>  
  5.        items.<span style="color:rgb(0,119,136)">py</span>  
  6.        pipelines.<span style="color:rgb(0,119,136)">py</span>  
  7.        settings.<span style="color:rgb(0,119,136)">py</span>  
  8.        spiders<span style="color:rgb(0,0,64)">/</span>  
  9.            __init__.<span style="color:rgb(0,119,136)">py</span>  

scrapy.cfg: 项目配置文件
items.py: 需要提取的数据结构定义文件
pipelines.py: 管道定义,用来对items里面提取的数据做进一步处理,如保存等
settings.py: 爬虫配置文件
spiders: 放置spider的目录

定义Item

在items.py里面定义我们要抓取的数据:

123456
[python] view plaincopy
  1. <span style="color:rgb(255,119,0)"><strong>from</strong></span> scrapy.<span style="color:black">item</span> <span style="color:rgb(255,119,0)"><strong>import</strong></span> Item, Field  
  2.    
  3. <span style="color:rgb(255,119,0)"><strong>class</strong></span> DmozItem<span style="color:black">(</span>Item<span style="color:black">)</span>:  
  4.    title = Field<span style="color:black">(</span><span style="color:black">)</span>  
  5.    link = Field<span style="color:black">(</span><span style="color:black">)</span>  
  6.    desc = Field<span style="color:black">(</span><span style="color:black">)</span>  

这里我们需要获取dmoz页面上的标题,链接,描述,所以定义一个对应的items结构,不像Django里面models的定义有那么多种类的Field,这里只有一种就叫Field(),再复杂就是Field可以接受一个default值。

实现Spider

spider只是一个继承字scrapy.spider.BaseSpider的Python类,有三个必需的定义的成员

name: 名字,这个spider的标识
start_urls: 一个url列表,spider从这些网页开始抓取
parse(): 一个方法,当start_urls里面的网页抓取下来之后需要调用这个方法解析网页内容,同时需要返回下一个需要抓取的网页,或者返回items列表

所以在spiders目录下新建一个spider,dmoz_spider.py:

12345678910
[python] view plaincopy
  1. <span style="color:rgb(255,119,0)"><strong>class</strong></span> DmozSpider<span style="color:black">(</span>BaseSpider<span style="color:black">)</span>:  
  2.    name = <span style="color:rgb(72,61,139)">"dmoz.org"</span>  
  3.    start_urls = <span style="color:black">[</span>  
  4.        <span style="color:rgb(72,61,139)">"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"</span>,  
  5.        <span style="color:rgb(72,61,139)">"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"</span>  
  6.    <span style="color:black">]</span>  
  7.    
  8.    <span style="color:rgb(255,119,0)"><strong>def</strong></span> parse<span style="color:black">(</span><span style="color:rgb(0,128,0)">self</span>, response<span style="color:black">)</span>:  
  9.        filename = response.<span style="color:black">url</span>.<span style="color:black">split</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">"/"</span><span style="color:black">)</span><span style="color:black">[</span>-<span style="color:rgb(255,69,0)">2</span><span style="color:black">]</span>  
  10.        <span style="color:rgb(0,128,0)">open</span><span style="color:black">(</span>filename, <span style="color:rgb(72,61,139)">'wb'</span><span style="color:black">)</span>.<span style="color:black">write</span><span style="color:black">(</span>response.<span style="color:black">body</span><span style="color:black">)</span>  

提取Item

提取数据到Items里面,主要用到XPath提取网页数据:

scrapy有提供两个XPath选择器,HtmlXPathSelector和XmlXPathSelector,一个用于HTML,一个用于XML,XPath选择器有三个方法

select(xpath): 返回一个相对于当前选中节点的选择器列表(一个XPath可能选到多个节点)
extract(): 返回选择器(列表)对应的节点的字符串(列表)
re(regex): 返回正则表达式匹配的字符串(分组匹配)列表
一种很好的方法是在Shell里面对XPath进行测试:

1
[python] view plaincopy
  1. scrapy shell http://www.<span style="color:black">dmoz</span>.<span style="color:black">org</span>/Computers/Programming/Languages/Python/Books/  

现在修改parse()方法看看如何提取数据到items里面去:

1234567891011
[python] view plaincopy
  1. <span style="color:rgb(255,119,0)"><strong>def</strong></span> parse<span style="color:black">(</span><span style="color:rgb(0,128,0)">self</span>, response<span style="color:black">)</span>:  
  2.       hxs = HtmlXPathSelector<span style="color:black">(</span>response<span style="color:black">)</span>  
  3.       sites = hxs.<span style="color:rgb(220,20,60)">select</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">'//ul/li'</span><span style="color:black">)</span>  
  4.       items = <span style="color:black">[</span><span style="color:black">]</span>  
  5.       <span style="color:rgb(255,119,0)"><strong>for</strong></span> <span style="color:rgb(220,20,60)">site</span> <span style="color:rgb(255,119,0)"><strong>in</strong></span> sites:  
  6.           item = DmozItem<span style="color:black">(</span><span style="color:black">)</span>  
  7.           item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'title'</span><span style="color:black">]</span> = <span style="color:rgb(220,20,60)">site</span>.<span style="color:rgb(220,20,60)">select</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">'a/text()'</span><span style="color:black">)</span>.<span style="color:black">extract</span><span style="color:black">(</span><span style="color:black">)</span>  
  8.           item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'link'</span><span style="color:black">]</span> = <span style="color:rgb(220,20,60)">site</span>.<span style="color:rgb(220,20,60)">select</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">'a/@href'</span><span style="color:black">)</span>.<span style="color:black">extract</span><span style="color:black">(</span><span style="color:black">)</span>  
  9.           item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'desc'</span><span style="color:black">]</span> = <span style="color:rgb(220,20,60)">site</span>.<span style="color:rgb(220,20,60)">select</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">'text()'</span><span style="color:black">)</span>.<span style="color:black">extract</span><span style="color:black">(</span><span style="color:black">)</span>  
  10.           items.<span style="color:black">append</span><span style="color:black">(</span>item<span style="color:black">)</span>  
  11.       <span style="color:rgb(255,119,0)"><strong>return</strong></span> items  

实现PipeLine

PipeLine用来对Spider返回的Item列表进行保存操作,可以写入到文件、或者数据库等。

PipeLine只有一个需要实现的方法:process_item,例如我们将Item保存到一个文件中:

12345
[python] view plaincopy
  1. <span style="color:rgb(255,119,0)"><strong>def</strong></span> <span style="color:rgb(0,0,205)">__init__</span><span style="color:black">(</span><span style="color:rgb(0,128,0)">self</span><span style="color:black">)</span>:  
  2.     <span style="color:rgb(0,128,0)">self</span>.<span style="color:rgb(0,128,0)">file</span> = <span style="color:rgb(0,128,0)">open</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">'jingdong.txt'</span>, <span style="color:rgb(72,61,139)">'wb'</span><span style="color:black">)</span>  
  3.    
  4. <span style="color:rgb(255,119,0)"><strong>def</strong></span> process_item<span style="color:black">(</span><span style="color:rgb(0,128,0)">self</span>, item, spider<span style="color:black">)</span>:  
  5.     <span style="color:rgb(0,128,0)">self</span>.<span style="color:rgb(0,128,0)">file</span>.<span style="color:black">write</span><span style="color:black">(</span>item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'title'</span><span style="color:black">]</span> + <span style="color:rgb(72,61,139)">'<span style="color:rgb(0,0,153)"><strong>\t</strong></span>'</span>+ item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'link'</span><span style="color:black">]</span> + <span style="color:rgb(72,61,139)">'<span style="color:rgb(0,0,153)"><strong>\t</strong></span>'</span> + item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'desc'</span><span style="color:black">]</span>+<span style="color:rgb(72,61,139)">'<span style="color:rgb(0,0,153)"><strong>\n</strong></span>'</span><span style="color:black">)</span>  

到现在,我们就完成了一个基本的爬虫的实现,可以输入下面的命令来启动这个Spider:

1
[python] view plaincopy
  1. scrapy crawl dmoz.<span style="color:black">org</span>  

原创文章,转载请注明:转载自CodeLogic[http://www.icodelogic.com]
本文链接地址: http://www.icodelogic.com/?p=441


原创粉丝点击