從存儲方式上分為2種,存入磁盤和數據庫。
如下是原始的爬蟲代碼
# -*- coding: utf-8 -*-
import scrapy
class FirstfileSpider(scrapy.Spider):
name = 'firstfile'
start_urls = ['https://www.qiushibaike.com/text/']
def parse(self, response):
# 使用框架的xpath接口
list_div = response.xpath('//div[@id="content-left"]/div')
for div in list_div:
author = div.xpath("./div/a[2]/h2/text()").extract()[0]
content = div.xpath("./a/div/span/text()").extract()[0]
a.磁盤文件
1.基於終端指令的持久化存儲
首先保證parse方法返回一個可迭代類型的對象(存儲解析到的頁面內容),再使用終端指令完成數據存儲到制定磁盤文件中的操作。代碼修改如下
# -*- coding: utf-8 -*-
import scrapy
class FirstfileSpider(scrapy.Spider):
name = 'firstfile'
start_urls = ['https://www.qiushibaike.com/text/']
def parse(self, response):
# 使用框架的xpath接口
list_div = response.xpath('//div[@id="content-left"]/div')
# 存儲解析到的頁面數據
data_list = []
for div in list_div:
author = div.xpath("./div/a[2]/h2/text()").extract()[0]
content = div.xpath("./a/div/span/text()").extract()[0]
res_dict = {
"author": author,
"content": content,
}
data_list.append(res_dict)
return data_list
終端輸入參數為:scrapy crawl 你的文件名 –o test.csv
當然你也可以用其他的格式。在打開test.csv可以看見結果。
2.基於管道的持久化存儲
如同Django里面的models一樣,items.py用來設置數據存儲模版,結構化數據。pipelines用來數據持久化處理。總的來說就是items先存儲解析到的頁面數據,然后pipelines處理持久化存儲的相關操作.
代碼的實現流程:
1.將解析到的頁面數據存儲到items對象
2.使用yield關鍵字將items提交給管道文件進行處理
3.在管道文件編寫代碼完成數據存儲的操作
4.在配置文件中開啟管道操作
firstproject(爬蟲文件名字).py
# -*- coding: utf-8 -*-
import scrapy
from firstproject.items import FirstprojectItem
class FirstfileSpider(scrapy.Spider):
name = 'firstfile'
start_urls = ['https://www.qiushibaike.com/text/']
def parse(self, response):
list_div = response.xpath('//div[@id="content-left"]/div')
for div in list_div:
author = div.xpath("./div/a[2]/h2/text()").extract()[0]
content = div.xpath(".//div[@class='content']/span/text()").extract()[0]
print(author)
print(content)
# 1 存儲到items對象
item = FirstprojectItem()
item['author'] = author
item['content'] = content
# 2 提交給管道
yield item
items.py
import scrapy
class FirstprojectItem(scrapy.Item):
# define the fields for your item here like:
author = scrapy.Field()
content = scrapy.Field()
pipelines.py
class FirstprojectPipeline(object):
fp = None
def open_spider(self, spider):
# 該方法再整個流程中被調用一次
print("開始爬蟲")
self.fp = open("./test.txt", "w", encoding="utf-8")
# 爬蟲每向管道提交一次item,該方法就會被執行一次
def process_item(self, item, spider):
ITEM_PIPELINES = {
'firstproject.pipelines.FirstprojectPipeline': 300,
}
# item就是接受到的item對象
author = item["author"]
content = item["content"]
# 持久化存儲操作
self.fp.write(author+":"+content)
return item
def close_spider(self, spider):
print("爬蟲結束")
self.fp.close()
settings.py中添加這一行
ITEM_PIPELINES = {
'firstproject.pipelines.FirstprojectPipeline': 300,
}
b.數據庫
代碼流程:類似於管道持久化,區別就是pipelines文件中持久化方式的區別
1.基於mysql持久化存儲
在上面的基礎上修改下pipelines文件,其他注意提前在mysql創建好相應的表的列和行
import pymysql
class FirstprojectPipeline(object):
conn = None
cursor = None
def open_spider(self):
self.conn = pymysql.Connect(host="127.0.0.1", port=3306, user='root')
def process_item(self, item, spider):
# item就是接受到的item對象
author = item["author"]
content = item["content"]
sql = 'insert into qiubai values ("%s","%s")' % (author, content)
self.cursor = self.conn.cursor()
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback()
return item
def close_spider(self):
self.cursor.close()
2.基於redis存儲
由於windows對redis支持不友好,所以我們這里在Linux上開發。非分布式的爬蟲在這里實際上和基於mysql只有pipelines文件的區別。
首先開啟好redis服務,再連接即可。注意這里的python的redis模塊使用的是2.10.6版本。使用命令pip3 install redis-2.10.6來回退版本。
import redis
class FirstprojectPipeline(object):
conn = None
def open_spider(self, spider):
print("start spider")
self.conn = redis.Redis(host="127.0.0.1", port=6379)
def process_item(self, item, spider):
my_dict = {
"author": item['author'],
'content': item['content'],
}
print(my_dict)
try:
self.conn.rpush("my_data", my_dict)
except Exception as e:
print(e)
return item
然后在終端輸入redis-cli開啟客戶端,輸入hgetall my_data查看是否寫入即可。可能會抽風,等待下網絡即可。

