一步一步学Scrapy:setp 2

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

首先我们来分析一下页面


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

1
<strong><a href="/sub/50/name/2" title="Next page">Next »</a></strong>

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

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

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

代码实现

1
2
3
4
5
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、编写代码

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
26
27
28
29
30
31
32
33
34
35
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数据库文件,并将采集回来的数据保存在数据库文件中。

文章目录
  1. 1. 首先我们来分析一下页面
  2. 2. 代码实现
  3. 3. 简单配置Scrapy防止爬虫给封
  4. 4. 将爬取的数据,保存在数据库中
,