一步一步学Scrapy:setp 2

step 1简单爬取了mininova-ebook第一页的数据,接下来我们来写爬取ebook所有的数据

首先我们来分析一下页面

一步一步学Scrapy:setp 2_第1张图片

查看源代码,在点击Next »包含有下一页的链接,我们可以用来实现自动翻页爬取

Next »

查看一下最后一页的源代码

  • Next »

  • 很容易就可以发现如何判断最后一页

    代码实现

    next_page = response.xpath(u'//strong/a[text()="Next »"]/@href').extract()
    if  next_page:
        for next_page in next_page:
            next_page = 'http://www.mininova.org' + next_page
            yield scrapy.Request(next_page,callback=self.parse)
    

    由于每一页的代码格式是一样的,那么就直接callback=self.parse直接调用parse函数来获取数据。

    简单配置Scrapy防止爬虫给封

    1、详细配置留下一篇在详解,这里只设置download_delay值,它的作用主要设置下载的等待时间,大规模集中的访问对服务器的影响最大,相当于段时间增大服务器负载。
    2、在mininova目录下有一个settings.py文件,打开settings.py找到# DOWNLOAD_DELAY去掉注释号,修改值为3DOWNLOAD_DELAY = 3间隔3秒。

    将爬取的数据,保存在数据库中

    1、当item在Spider中被收集之后,它将会被传递到item Pipline,我们将利用Pipline将数据保存到数据库中
    2、编写代码

    import sqlite3
    from os import path
    
    from scrapy import signals
    from scrapy.xlib.pydispatch import dispatcher
    
    class MininovaPipeline(object):
        filename = 'ebook.sqlite'
        def __init__(self):
            self.conn = None
            dispatcher.connect(self.initialize, signals.engine_started)
            dispatcher.connect(self.finalize, signals.engine_stopped)
    
        def process_item(self, item, spider):
            self.conn.execute('insert into ebook values(?,?,?,?)',  (None, item['title'][0], \
            item['link'], item['size']))
            return item
    
        def initialize(self):
            if path.exists(self.filename):
                self.conn = sqlite3.connect(self.filename)
            else:
                self.conn = self.create_table(self.filename)
    
        def finalize(self):
            if self.conn is not None:
                self.conn.commit()
                self.conn.close()
                self.conn = None
    
        def create_table(self, filename):
            conn = sqlite3.connect(filename)
            conn.execute("""create table ebook(id integer primary key autoincrement, title text, link text, size text)""")
            conn.commit()
            return conn
    

    3、修改settings.py修改ITEM_PIPELINES的值,ITEM_PIPELINES = {'mininova.pipelines.MininovaPipeline':300}
    4、执行scrapy crawl mininova即可,执行时将在miniova目录下生成ebook.sqlite数据库文件,并将采集回来的数据保存在数据库文件中。

    你可能感兴趣的:(一步一步学Scrapy:setp 2)