文章摘錄:https://github.com/lawlite19/PythonCrawler-Scrapy-Mysql-File-Template
settings.py
- 修改Mysql的配置信息
#Mysql數(shù)據(jù)庫的配置信息
MYSQL_HOST = '127.0.0.1'
MYSQL_DBNAME = 'testdb' #數(shù)據(jù)庫名字,請修改
MYSQL_USER = 'root' #數(shù)據(jù)庫賬號,請修改
MYSQL_PASSWD = '123456' #數(shù)據(jù)庫密碼,請修改
MYSQL_PORT = 3306 #數(shù)據(jù)庫端口,在dbhelper中使用
- 指定pipelines
ITEM_PIPELINES = {
'webCrawler_scrapy.pipelines.WebcrawlerScrapyPipeline': 300,#保存到mysql數(shù)據(jù)庫
}
items.py
- 聲明需要格式化處理的字段
class WebcrawlerScrapyItem(scrapy.Item):
'''定義需要格式化的內容(或是需要保存到數(shù)據(jù)庫的字段)'''
# define the fields for your item here like:
# name = scrapy.Field()
name = scrapy.Field() #修改你所需要的字段
url = scrapy.Field()
pipelines.py
一、保存到數(shù)據(jù)庫的類WebcrawlerScrapyPipeline(在settings中聲明)
- 定義一個類方法
from_settings,得到settings中的Mysql數(shù)據(jù)庫配置信息,得到數(shù)據(jù)庫連接池dbpool
@classmethod
def from_settings(cls,settings):
'''1、@classmethod聲明一個類方法,而對于平常我們見到的則叫做實例方法。
2、類方法的第一個參數(shù)cls(class的縮寫,指這個類本身),而實例方法的第一個參數(shù)是self,表示該類的一個實例
3、可以通過類來調用,就像C.f(),相當于java中的靜態(tài)方法'''
dbparams=dict(
host=settings['MYSQL_HOST'],#讀取settings中的配置
db=settings['MYSQL_DBNAME'],
user=settings['MYSQL_USER'],
passwd=settings['MYSQL_PASSWD'],
charset='utf8',#編碼要加上,否則可能出現(xiàn)中文亂碼問題
cursorclass=MySQLdb.cursors.DictCursor,
use_unicode=False,
)
dbpool=adbapi.ConnectionPool('MySQLdb',**dbparams)#**表示將字典擴展為關鍵字參數(shù),相當于host=xxx,db=yyy....
return cls(dbpool)#相當于dbpool付給了這個類,self中可以得到
-
__init__中會得到連接池dbpool
def __init__(self,dbpool):
self.dbpool=dbpool
-
process_item方法是pipeline默認調用的,進行數(shù)據(jù)庫操作
#pipeline默認調用
def process_item(self, item, spider):
query=self.dbpool.runInteraction(self._conditional_insert,item)#調用插入的方法
query.addErrback(self._handle_error,item,spider)#調用異常處理方法
return item
- 插入數(shù)據(jù)庫方法
_conditional_insert
#寫入數(shù)據(jù)庫中
def _conditional_insert(self,tx,item):
#print item['name']
sql="insert into testpictures(name,url) values(%s,%s)"
params=(item["name"],item["url"])
tx.execute(sql,params)
- 錯誤處理方法
_handle_error
#錯誤處理方法
def _handle_error(self, failue, item, spider):
print failue