scapy递归爬

前面介绍了Scrapy如何实现一个最简单的爬虫,但是这个Demo里只是对一个页面进行了抓取。在实际应用中,爬虫一个重要功能是”发现新页面”,然后递归的让爬取操作进行下去。

发现新页面的方法很简单,我们首先定义一个爬虫的入口URL地址,比如《Scrapy入门教程》中的start_urls,爬虫首先将这个页面的内容抓取之后,解析其内容,将所有的链接地址提取出来。这个提取的过程是很简单的,通过一个html解析库,将这样的节点内容提取出来,href参数的值就是一个新页面的URL。获取这个URL值之后,将其加入到任务队列中,爬虫不断的从队列中取URL即可。这样,只需要为爬虫定义一个入口的URL,那么爬虫就能够自动的爬取到指定网站的绝大多数页面。

当然,在具体的实现中,我们还需要对提取的URL做进一步处理:

1. 判断URL指向网站的域名,如果指向的是外部网站,那么可以将其丢弃
2. URL去重,可以将所有爬取过的URL存入数据库中,然后查询新提取的URL在数据库中是否存在,如果存在的话,当然就无需再去爬取了。

下面介绍一下如何在Scrapy中完成上述这样的功能。

我们只需要改写spider的那个py文件即可,修改parse()方法代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[python]  view plain copy
  1. <span style="color:rgb(255,119,0)"><strong>from</strong></span> scrapy.<span style="color:black">selector</span> <span style="color:rgb(255,119,0)"><strong>import</strong></span> HtmlXPathSelector  
  2.    
  3. <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>:  
  4.     hxs = HtmlXPathSelector<span style="color:black">(</span>response<span style="color:black">)</span>  
  5.     items = <span style="color:black">[</span><span style="color:black">]</span>  
  6.    
  7.     newurls = hxs.<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>  
  8.     validurls = <span style="color:black">[</span><span style="color:black">]</span>  
  9.         <span style="color:rgb(255,119,0)"><strong>for</strong></span> url <span style="color:rgb(255,119,0)"><strong>in</strong></span> newurls:  
  10.                 <span style="color:rgb(128,128,128)"><em>#判断URL是否合法</em></span>  
  11.                 <span style="color:rgb(255,119,0)"><strong>if</strong></span> true:   
  12.                         validurls.<span style="color:black">append</span><span style="color:black">(</span>url<span style="color:black">)</span>  
  13.    
  14.         items.<span style="color:black">extend</span><span style="color:black">(</span><span style="color:black">[</span><span style="color:rgb(0,128,0)">self</span>.<span style="color:black">make_requests_from_url</span><span style="color:black">(</span>url<span style="color:black">)</span>.<span style="color:black">replace</span><span style="color:black">(</span>callback=<span style="color:rgb(0,128,0)">self</span>.<span style="color:black">parse</span><span style="color:black">)</span> <span style="color:rgb(255,119,0)"><strong>for</strong></span> url <span style="color:rgb(255,119,0)"><strong>in</strong></span> validurls<span style="color:black">]</span><span style="color:black">)</span>  
  15.    
  16.         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>  
  17.         items = <span style="color:black">[</span><span style="color:black">]</span>  
  18.         <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:  
  19.                 item = DmozItem<span style="color:black">(</span><span style="color:black">)</span>  
  20.                 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>  
  21.                 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>  
  22.                 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>  
  23.                 items.<span style="color:black">append</span><span style="color:black">(</span>item<span style="color:black">)</span>  
  24.    
  25.         <span style="color:rgb(255,119,0)"><strong>return</strong></span> items  

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

tags: Python、Scrapy、爬虫

你可能感兴趣的:(scapy递归爬)