1. 程式人生 > >Scrapy爬蟲教程之URL解析與遞迴爬取

Scrapy爬蟲教程之URL解析與遞迴爬取

前面介紹了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
from scrapy.selector import
HtmlXPathSelector   def parse(self, response): hxs = HtmlXPathSelector(response) items = []   newurls = hxs.select('//a/@href').extract() validurls = [] for url in newurls: #判斷URL是否合法 if true: validurls.append(url)   items.extend([self
.make_requests_from_url(url).replace(callback=self.parse) for url in validurls])   sites = hxs.select('//ul/li') items = [] for site in sites: item = DmozItem() item['title'] = site.select('a/text()').extract() item['link'] = site.select('a/@href').extract() item['desc'] = site.select('text()').extract() items.append(item)   return items