用 python 寫爬蟲 爬取得資料儲存方式
mysql:
首先配置檔案:
ITEM_PIPELINES = { firstbloodpro.pipelines.MysqlproPipeline:300},配置好管道
第二配置好所需要的使用者名稱等
HOST='localhost'
POST=3306
USER='root'
PWD='123456'
DB='lala'
CHARSET = 'utf8'
管道中:
from scrapy.utils.project import get_project_settings
import pymysql
class MysqlproPipeline(object):
def open_spider(self,spider):
# setting 就是一個字典,字典的鍵值就是所有的配置選項
settings = get_project_settings()
self.db = pymysql.Connect(host = settings['HOST'],port = ['PORT'],user = ['USER'],pwd= ['PWD'],db = ['lala'],charset=['utf8'])
def close_spider(self,spider):
self.db.close()
def process_item(self,item,spider):
self.save_to_mysql(item)
retrun item
def save_to_mysql(self,item):
# 獲取cursor
cursor = self.db.cursor()
# 拼接sql語句
sql = 'insert into haha(face, name,age, content,haha_count, ping_count) values("%s","%s","%s","%s","%s","%s")' % (item['face'], item['name'], item['age'], item['content'], item['haha_count'], item['ping_count'])
# 執行sql語句
try :
cursor.execute(sql)
self.db.commit()
except Exception as e:
print (e)
self .db.rollback()
mongodb:.
1 配置檔案:
ITEM_PIPELINES = { firstbloodpro.pipelines.MongodbproPipeline:300},
2:管道檔案:
import pymongo
class MongodbproPiepeline(object):
def open_spider(self,spider):
self.client = pymongo.MongoClient(host = 'localhost',port=27017)
def close_spider(self,spider):
self.client.close()
def process_item(self,item,spider):
# 選擇資料庫
db.self.client.xxx
# 選擇集合
col = db.xxxx
#將item轉化為字典
dic = dict(item)
col.insert(dic)
return item
sqlite:
在 管道檔案中
import sqlite3
class Sqlite3proPipeline(object):
def open_spider(self,spider):
self.db = sqlite3.connect(home.db)
self.cur = self.db.cursor()
def close_spider(self,spider):
self.db.close()
def process_item(self,item,spider):
self.save_to_sqlite(item)
return item
def save_to_sqlite(self,item):
sql = 'insert into dameo(city,title,rentway,price,housetype,area,address,traffic) values("%s","%s","%s","%s","%s","%s","%s","%s")' % (
item['city'], item['title'], item['rentway'], item['price'], item['housetype'], item['area'],item['address'], item['traffic'])'
try:
self.cur.execute(sql)
self.db.commit()
except Exception as e:
print(e)
self.db.rollback()
return item
在配置檔案中
ITEM_PIPELINES = { firstbloodpro.pipelines.Sqlite3proPipeline:300},
redis:
在配置檔案中:
將DOWNLOAD_DELAY = 3 下面的全部換成這個
# 指定使用scrapy-redis的排程器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 指定使用scrapy-redis的去重
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
# 指定排序爬取地址時使用的佇列,
# 預設的 按優先順序排序(Scrapy預設),由sorted set實現的一種非FIFO、LIFO方式。
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'
# 可選的 按先進先出排序(FIFO)
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderQueue'
# 可選的 按後進先出排序(LIFO)
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderStack'
# 在redis中保持scrapy-redis用到的各個佇列,從而允許暫停和暫停後恢復,也就是不清理redis queues
SCHEDULER_PERSIST = True
# 只在使用SpiderQueue或者SpiderStack是有效的引數,指定爬蟲關閉的最大間隔時間
# SCHEDULER_IDLE_BEFORE_CLOSE = 10
# 通過配置RedisPipeline將item寫入key為 spider.name : items 的redis的list中,供後面的分散式處理item
# 這個已經由 scrapy-redis 實現,不需要我們寫程式碼
ITEM_PIPELINES = {
'posted.pipelines.PostedPipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400
}
# 指定redis資料庫的連線引數
# REDIS_PASS是我自己加上的redis連線密碼(預設不做)
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
#REDIS_PASS = '[email protected]'
# LOG等級
LOG_LEVEL = 'DEBUG'
#預設情況下,RFPDupeFilter只記錄第一個重複請求。將DUPEFILTER_DEBUG設定為True會記錄所有重複的請求。
DUPEFILTER_DEBUG =True
# 覆蓋預設請求頭,可以自己編寫Downloader Middlewares設定代理和UserAgent
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Connection': 'keep-alive',
'Accept-Encoding': 'gzip, deflate, sdch'
}