一、爬取準(zhǔn)備
-
網(wǎng)站分析
總體分析:經(jīng)過(guò)分析發(fā)現(xiàn),中關(guān)村手機(jī)基本上都是傳統(tǒng)的網(wǎng)頁(yè)模式,并沒(méi)有用到前后端分離(json傳輸數(shù)據(jù)),這個(gè)時(shí)候只要對(duì)頁(yè)面的URL進(jìn)行分析
-
URL分析:url也是規(guī)規(guī)矩矩的拼接
subcate57_list_1.html
末尾的list_1拴测,這里的數(shù)字代替頁(yè)數(shù)
-
然后通過(guò)每個(gè)手機(jī)的鏈接獲得其手機(jī)代號(hào)(姑且取名叫代號(hào)吧)
手機(jī)信息url:cell_phone/index1241574.shtml 這個(gè)url里index后的幾位數(shù)字即為手機(jī)代號(hào) 手機(jī)詳細(xì)參數(shù)url:cn/1242/1241574/param.shtml 很容易發(fā)現(xiàn)中間的4位數(shù)字是后面長(zhǎng)數(shù)字前4位+1(1242 = 1241xxxx+1),接下來(lái)可以開(kāi)干了
二府蛇、代碼
-
scrapy
-
代碼很簡(jiǎn)單集索,就不貼出來(lái)了
... ...
-
考慮到要存入到Mysql數(shù)據(jù)庫(kù),一直苦于沒(méi)有像MongoDB汇跨,redis那么好用务荆,如果每條都建立一個(gè)連接,就scrapy這個(gè)爬取速度肯定是吃不消的穷遂,網(wǎng)上找了一個(gè)處理scrapy—mysql的例子函匕,用起來(lái)挺舒服的,而且查看了Mysql蚪黑,并沒(méi)有造成阻塞盅惜,數(shù)據(jù)丟失,連接數(shù)爆炸等情況忌穿,所以重點(diǎn)分享一下這個(gè)Pipeline抒寂,最后記得到settings里啟用
# pipelines.py class MysqlPipelineZ(object): def __init__(self, dbpool): self.dbpool = dbpool @classmethod def from_settings(cls, settings): """ 數(shù)據(jù)庫(kù)建立連接 :param settings: 配置參數(shù) :return: 實(shí)例化參數(shù) """ adbparams = dict( host=settings['MYSQL_HOST'], db=settings['MYSQL_DB'], user=settings['MYSQL_USER'], password=settings['MYSQL_PASSWORD'], cursorclass=pymysql.cursors.DictCursor # 指定cursor類(lèi)型 ) # 連接數(shù)據(jù)池ConnectionPool,使用pymysql dbpool = adbapi.ConnectionPool('pymysql', **adbparams) # 返回實(shí)例化參數(shù) return cls(dbpool) def process_item(self, item, spider): """ 使用twisted將MySQL插入變成異步執(zhí)行掠剑。通過(guò)連接池執(zhí)行具體的sql操作屈芜,返回一個(gè)對(duì)象 """ query = self.dbpool.runInteraction(self.do_insert, item) # 指定操作方法和操作數(shù)據(jù) # 添加異常處理 query.addCallback(self.handle_error) # 處理異常 def do_insert(self, cursor, item): # 對(duì)數(shù)據(jù)庫(kù)進(jìn)行插入操作,并不需要commit朴译,twisted會(huì)自動(dòng)commit insert_sql = """ insert into zolPhone(model,sellTime,updateTime) VALUES (%s,%s,%s) """ cursor.execute(insert_sql, (item['phone_name'], item['sell_time'], item['update_time'])) def handle_error(self, failure): if failure: # 打印錯(cuò)誤信息 print(failure)
-
三沸伏、小結(jié)
整個(gè)爬取過(guò)程和速度非常滿(mǎn)意,之前偷懶用requests爬取大約20min动分,改用scrapy大概40s,好久沒(méi)寫(xiě)新的爬蟲(chóng)了红选,都快要忘記最初的興趣了澜公,希望來(lái)年多多歷練,大家一起進(jìn)步!