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 | next_page = response.xpath(u'//strong/a[text()="Next »"]/@href').extract() |
由于每一页的代码格式是一样的,那么就直接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
35import 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数据库文件,并将采集回来的数据保存在数据库文件中。