• scrapy 的三个入门应用场景


    说明
    本文参照了官网的 dmoz 爬虫例子。

    不过这个例子有些年头了,而 dmoz.org 的网页结构已经不同以前。所以我对xpath也相应地进行了修改

    概要
    本文提出了scrapy 的三个入门应用场景

    1. 爬取单页
    2. 根据目录页面,爬取所有指向的页面
    3. 爬取第一页,然后根据第一页的连接,再爬取下一页...。依此,直到结束

    对于场景二、场景三可以认为都属于:链接跟随(Following links)

    链接跟随的特点就是:在 parse 函数结束时,必须 yield 一个带回调函数 callback 的 Request 类的实例

    本文基于:windows 7 (64) + python 3.5 (64) + scrapy 1.2

    场景一

    描述

    爬取单页内容

    示例代码

    import scrapy
    
    from tutorial.items import DmozItem
    
    class DmozSpider(scrapy.Spider):
        name = "dmoz"
        allowed_domains = ["dmoz.org"]
    
        start_urls = [
            "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
            "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
        ]
    
        def parse(self, response):        
            for div in response.xpath('//div[@class="title-and-desc"]'):
                item = DmozItem()
                item['title'] = div.xpath('a/div/text()').extract_first().strip()
                item['link'] = div.xpath('a/@href').extract_first()
                item['desc'] = div.xpath('div[@class="site-descr "]/text()').extract_first().strip()
                yield item
    

    场景二

    描述

    • ①进入目录,提取连接。
    • ②然后爬取连接指向的页面的内容
      其中①的yield scrapy.Request的callback指向②

    官网描述

    ...extract the links for the pages you are interested, follow them and then extract the data you want for all of them.

    示例代码

    import scrapy
    
    from tutorial.items import DmozItem
    
    class DmozSpider(scrapy.Spider):
        name = "dmoz"
        allowed_domains = ["dmoz.org"]
    
        start_urls = [
            'http://www.dmoz.org/Computers/Programming/Languages/Python/' # 这是目录页面
        ]
        
        def parse(self, response):
            for a in response.xpath('//section[@id="subcategories-section"]//div[@class="cat-item"]/a'):
                url = response.urljoin(a.xpath('@href').extract_first().split('/')[-2])
                yield scrapy.Request(url, callback=self.parse_dir_contents)
            
            
        def parse_dir_contents(self, response):
            for div in response.xpath('//div[@class="title-and-desc"]'):
                item = DmozItem()
                item['title'] = div.xpath('a/div/text()').extract_first().strip()
                item['link'] = div.xpath('a/@href').extract_first()
                item['desc'] = div.xpath('div[@class="site-descr "]/text()').extract_first().strip()
                yield item
    

    场景三

    描述

    • ①进入页面,爬取内容,并提取下一页的连接。
    • ②然后爬取下一页连接指向的页面的内容
      其中①的yield scrapy.Request的callback指向①自己

    官网描述

    A common pattern is a callback method that extracts some items, looks for a link to follow to the next page and then yields a Request with the same callback for it

    示例代码

    import scrapy
    
    from myproject.items import MyItem
    
    class MySpider(scrapy.Spider):
        name = 'example.com'
        allowed_domains = ['example.com']
    
        start_urls = [
            'http://www.example.com/1.html',
            'http://www.example.com/2.html',
            'http://www.example.com/3.html',
        ]
    
        def parse(self, response):
            for h3 in response.xpath('//h3').extract():
                yield MyItem(title=h3)
    
            for url in response.xpath('//a/@href').extract():
                yield scrapy.Request(url, callback=self.parse)
                
    

    说明
    第三个场景未测试!

  • 相关阅读:
    flash模拟EEROM
    FATFS_SD卡
    AFIO
    ADC1多通道_DMA_内部温度传感器+内部VREFINT
    QmlBook--Meet Qt 5
    NRF24L01
    MWC飞控V2.3串口通信协议——new Multiwii Serial Protocol
    thread相关http://blog.csdn.net/forwayfarer/article/details/3455130
    comparable与comparator的区别http://blog.csdn.net/mageshuai/article/details/3849143
    ArrayList和LinkedList的区别http://pengcqu.iteye.com/blog/502676
  • 原文地址:https://www.cnblogs.com/hhh5460/p/5821501.html
Copyright © 2020-2023  润新知