VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • python爬虫框架scrapy实例详解(3)

让scrapy自动抓取网页上的所有链接

上面的示例中scrapy只抓取了start_urls里面的两个url的内容,但是通常我们想实现的是scrapy自动发现一个网页上的所有链接,然后再去抓取这些链接的内容。为了实现这一点我们可以在parse方法里面提取我们需要的链接,然后构造一些Request对象,并且把他们返回,scrapy会自动的去抓取这些链接。代码类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MySpider(BaseSpider):
    name= 'myspider'
    start_urls= (
        'http://example.com/page1',
        'http://example.com/page2',
        )
    def parse(self, response):
        # collect `item_urls`
        for item_urlin item_urls:
            yield Request(url=item_url, callback=self.parse_item)
    def parse_item(self, response):
        item= MyItem()
        # populate `item` fields
        yield Request(url=item_details_url, meta={'item': item},
            callback=self.parse_details)
    def parse_details(self, response):
        item= response.meta['item']
        # populate more `item` fields
        return item

 

parse是默认的callback, 它返回了一个Request列表,scrapy自动的根据这个列表抓取网页,每当抓到一个网页,就会调用parse_item,parse_item也会返回一个列表,scrapy又会根据这个列表去抓网页,并且抓到后调用parse_details

为了让这样的工作更容易,scrapy提供了另一个spider基类,利用它我们可以方便的实现自动抓取链接. 我们要用到CrawlSpider

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from scrapy.contrib.linkextractors.sgmlimport SgmlLinkExtractor
class MininovaSpider(CrawlSpider):
    name= 'mininova.org'
    allowed_domains= ['mininova.org']
    start_urls= ['http://www.mininova.org/today']
    rules= [Rule(SgmlLinkExtractor(allow=['/tor/\d+'])),
             Rule(SgmlLinkExtractor(allow=['/abc/\d+']),'parse_torrent')]
    def parse_torrent(self, response):
        x= HtmlXPathSelector(response)
        torrent= TorrentItem()
        torrent['url']= response.url
        torrent['name']= x.select("//h1/text()").extract()
        torrent['description']= x.select("//div[@id='description']").extract()
        torrent['size']= x.select("//div[@id='info-left']/p[2]/text()[2]").extract()
        return torrent

相关教程