一步一步学Scrapy:setp 2

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

首先我们来分析一下页面


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

<strong><a href="//www.greatytc.com/sub/50/name/2" title="Next page">Next »</a></strong>

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

<li class="disabled"><span>Next »</span></li>


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

代码实现

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数据库文件,并将采集回来的数据保存在数据库文件中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容