昨天呢講了如何通過(guò)一個(gè)最基本的爬蟲來(lái)抓取單個(gè)頁(yè)面上的數(shù)據(jù)锅必,但這樣我們肯定是不能滿足的胎撇,比如我們想要抓取一個(gè)人的所有微博的數(shù)據(jù)热幔,那怎么辦呢?我們不能手動(dòng)的去點(diǎn)擊“下一頁(yè)”众雷,我們肯定需要程序來(lái)幫我們做這件事情灸拍,所以我們今天的重點(diǎn)就是如何通過(guò)程序?qū)崿F(xiàn)自動(dòng)的跳轉(zhuǎn)頁(yè)面爬取數(shù)據(jù)。
Step1
? ? ?首先要做的前期準(zhǔn)備工作砾省,其實(shí)是針對(duì)新浪微博的特點(diǎn)鸡岗,由于新浪一定要登陸的用戶才能點(diǎn)擊下一頁(yè),不然只能看到第一頁(yè)的內(nèi)容编兄,所以我們要模擬登陸轩性。不過(guò)之前網(wǎng)上看到的其他模擬登陸的方法都太過(guò)復(fù)雜了,而且會(huì)隨著某浪自己改登陸加密方法而改動(dòng)狠鸳,很是不方便揣苏,所以我們用cookie的方式來(lái)登陸。
? ? ? 首先我們要找到自己在新浪微博的cookie件舵,仍然是登陸手機(jī)版卸察,然后在safari中點(diǎn)擊檢查元素,來(lái)檢查cookie铅祸,查找到了weibo.cn的很多cookie坑质,具體該用哪一個(gè)呢?這個(gè)...我的解決方法是都記下來(lái)傳給瀏覽器临梗,總有一個(gè)是有用的涡扼。
找到自己的cookie以后的方法就簡(jiǎn)單多了。首先我們要用一個(gè)dict把所有的cookie記錄下來(lái)
headers = {'gsid_CTandWM':'
your cookie'}
然后在發(fā)出請(qǐng)求中加入你的cookie
yield Request("http://weibo.cn/xiena",cookies=headers, callback=self.parse)
這樣就可以成功登陸啦
一定要注意的是盟庞,要重寫class的start_requests方法吃沪,這樣才能自定義初始訪問(wèn)狀態(tài),不然默認(rèn)的狀態(tài)是不會(huì)提交cookie的什猖。
Step2
接下來(lái)是我們的自動(dòng)跳轉(zhuǎn)部分巷波,實(shí)現(xiàn)自動(dòng)跳轉(zhuǎn)用的也是request方法萎津,具體實(shí)現(xiàn),就是像上一章一樣抹镊,用xpath找到要跳轉(zhuǎn)的鏈接锉屈,首先要分析html文件
這次我們用的是娜姐的微博,可以看到這個(gè)地方的href屬性就是我們需要找的跳轉(zhuǎn)鏈接了垮耳,用上次的方法把它提取出來(lái)
item['ids'] = sel.xpath('form/div/a/@href').extract()
然后用request方法跳轉(zhuǎn)颈渊,跳轉(zhuǎn)的時(shí)候需要注意加上cookie,同時(shí)终佛,item['ids']是一個(gè)list俊嗽,所以要遍歷它
for st in item['ids']:
? ? ? ?st = "http://weibo.cn"+st
? ? ? ?req = Request(url = st,cookies = headers, callback = self.parse)
? ? ? ?yield req
這樣以后,再運(yùn)行我們的小爬蟲铃彰,就可以看到它不斷的自動(dòng)翻頁(yè)爬取內(nèi)容啦~
總結(jié)
爬蟲小程序到現(xiàn)在已經(jīng)初步可以運(yùn)行了绍豁,那么下一步就應(yīng)該考慮優(yōu)化細(xì)節(jié),比如調(diào)整爬蟲的爬取時(shí)間間隔牙捉,避免被封賬號(hào)之類的事情0.0竹揍,然后要考慮如何優(yōu)化爬蟲的性能,同時(shí)考慮同時(shí)運(yùn)行多個(gè)爬蟲邪铲,分布式工作的方法芬位。