python爬蟲的最佳實(shí)踐(四)--扒取異步加載內(nèi)容并存入mongo數(shù)據(jù)庫(kù)

ps:課前規(guī)矩,ps一下。上節(jié)我們講了最簡(jiǎn)單的爬蟲轿塔,但是在真實(shí)的網(wǎng)絡(luò)環(huán)境下,并不是所有的網(wǎng)頁(yè)都能用那樣的方式抓取仲墨,用ajax異步請(qǐng)求數(shù)據(jù)的網(wǎng)頁(yè)就沒辦法用如上方式勾缭,那么我們今天就來(lái)看看如何抓取異步加載數(shù)據(jù)的網(wǎng)頁(yè)。(找網(wǎng)頁(yè)的時(shí)候發(fā)現(xiàn)簡(jiǎn)書的部分頁(yè)面也是用這種方式加載的目养,忍了很久還是放過了簡(jiǎn)書~~)

代碼預(yù)覽

#coding:utf-8
from bs4 import BeautifulSoup
import requests
import json
import pymongo

url = 'http://www.guokr.com/scientific/'

def dealData(url):
    client = pymongo.MongoClient('localhost', 27017)
    guoke = client['guoke']
    guokeData = guoke['guokeData']
    web_data = requests.get(url)
    datas = json.loads(web_data.text)
    print datas.keys()
    for data in datas['result']:
        guokeData.insert_one(data)

def start():
    urls = ['http://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&limit=20&offset={}&_=1462252453410'.format(str(i)) for i in range(20, 100, 20)]
    for url in urls:
        dealData(url)

start()

代碼剖析

細(xì)心的同學(xué)可能發(fā)現(xiàn)了俩由,這和昨天的沒什么區(qū)別啊0.0。其實(shí)不是這樣的混稽,這次我們要抓取的數(shù)據(jù)是果殼網(wǎng)的科學(xué)人分頁(yè)采驻,如果直接通過requests.get('http://www.guokr.com/scientific/')你會(huì)發(fā)現(xiàn)我們要的數(shù)據(jù)都不在返回網(wǎng)頁(yè)源代碼中审胚,這是因?yàn)槲覀円臄?shù)據(jù)都是通過ajax的方式異步加載的。那我們應(yīng)該如何抓取這部分內(nèi)容呢礼旅?首先用瀏覽器打開我們要抓的網(wǎng)頁(yè)

1.png

隨便選擇一個(gè)地方點(diǎn)開查看元素膳叨,細(xì)心的同學(xué)發(fā)現(xiàn)我們這次不用chrome改用火狐了,原因一會(huì)告訴大家~

2.png

選擇網(wǎng)絡(luò)標(biāo)簽和XHR分頁(yè)痘系,然后我們向下滑動(dòng)鼠標(biāo)滾輪可以發(fā)現(xiàn)一個(gè)一個(gè)的GET請(qǐng)求被列了出來(lái)菲嘴,這便是ajax異步加載的數(shù)據(jù),此時(shí)進(jìn)行觀察汰翠,如下圖:

3.png

我們可以看到每次請(qǐng)求的url龄坪,然后通過觀察url變化我們找到了規(guī)律,每次的偏移量offset都不一樣复唤,代表了我們?nèi)〕鰪氖裁次恢萌〕龆嗌贄l數(shù)據(jù)健田,觀察完url規(guī)律,我們點(diǎn)擊其中一條url佛纫,切換到響應(yīng)分頁(yè)妓局,如下圖所示:


4.png

我們可以看到請(qǐng)求回來(lái)的數(shù)據(jù)格式是json,而且數(shù)據(jù)結(jié)構(gòu)非常清晰呈宇,這也是我選用火狐的原因好爬,我們一眼可以找出我們需要的數(shù)據(jù)就在result這個(gè)key下面。

下面進(jìn)入我們的代碼甥啄,start()中拼接url的代碼我就不在贅述存炮,我們可以看到這次和上次不同的是引入了兩個(gè)新庫(kù)

import json
import pymongo

json庫(kù)是python自帶的json解析庫(kù),功能夠我們使用的蜈漓。pymongo是python和mongoDB交互用的庫(kù)穆桂。首先我們來(lái)看這段代碼:

client = pymongo.MongoClient('localhost', 27017)
guoke = client['guoke']
guokeData = guoke['guokeData']

PS:一定記得在執(zhí)行這段代碼之前先打開你本地的mongoDB數(shù)據(jù)庫(kù),我在環(huán)境配置章節(jié)有講怎么安裝mongoDB迎变,不會(huì)的同學(xué)請(qǐng)參見第二章環(huán)境配置充尉。
第一句飘言,建立一個(gè)pymongo的數(shù)據(jù)交互客戶端衣形,第二句選擇名為guoke的database,注意:如果有名為guoke的database則會(huì)直接使用已有的姿鸿,如果沒有則會(huì)自動(dòng)建立谆吴。第三句選擇guoke數(shù)據(jù)庫(kù)中名為guokeData的collection。

接下來(lái):

datas = json.loads(web_data.text) 
print datas.keys()

用json庫(kù)加載我們?nèi)〕龅臄?shù)據(jù)苛预,然后打印出數(shù)據(jù)的keys句狼,


5.png

我們可以看到和我們?cè)诨鸷鼮g覽器中的數(shù)據(jù)結(jié)構(gòu)一致,我們需要用的是其中的result字段热某,剛剛我們通過火狐觀察到result是一個(gè)list腻菇,然后我們遍歷result依次存入guokeData這個(gè)collection之中胳螟。所以,最后一句

guokeData.insert_one(data)

就是給collection中插入一條數(shù)據(jù)筹吐,我個(gè)人很喜歡抓取返回格式是json的網(wǎng)站糖耸,因?yàn)閿?shù)據(jù)格式很規(guī)范,可以直接存入mongo中任意取用丘薛,操作簡(jiǎn)單嘉竟。不用做數(shù)據(jù)序列化操作,而我們上節(jié)那樣解析出來(lái)的數(shù)據(jù)要存入數(shù)據(jù)庫(kù)就需要做序列化操作洋侨。

下來(lái)時(shí)代碼執(zhí)行完畢后數(shù)據(jù)庫(kù)的情況舍扰,可以看到我們的數(shù)據(jù)已經(jīng)盡數(shù)插入數(shù)據(jù)庫(kù)
![6.png]ACURNVC.png](http://upload-images.jianshu.io/upload_images/1957582-b3cd1e541ed57afd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以看到很舒服的數(shù)據(jù)結(jié)構(gòu)。

至此希坚,這一節(jié)的內(nèi)容告一段落边苹,當(dāng)然,并不是所有的異步加載網(wǎng)頁(yè)都需要我們?nèi)ネㄟ^觀察法獲取url然后再采集裁僧,這樣豈不是會(huì)很累勾给,下節(jié)將向大家介紹一種非常舒服的方式去做這件事。

寫在最后

慣例锅知,最佳實(shí)踐的前兩步我?guī)湍銈冏鐾炅瞬ゼ保信d趣的同學(xué)可以看一下擴(kuò)展作業(yè)哦。
作業(yè):抓取http://rent.591.com.hk/ 這個(gè)網(wǎng)站租房的信息售睹,信息都是采用ajax異步加載的方式桩警。而且剛好和我們上節(jié)的內(nèi)容是個(gè)強(qiáng)烈對(duì)比,不能通過更改url獲取分頁(yè)的數(shù)據(jù)了昌妹,很適合練手~~

有興趣的同學(xué)可以加群498945822一起交流學(xué)習(xí)哦~~
發(fā)現(xiàn)問題的同學(xué)歡迎指正捶枢,直接說就行,不用留面子飞崖,博主臉皮厚烂叔!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市固歪,隨后出現(xiàn)的幾起案子蒜鸡,更是在濱河造成了極大的恐慌,老刑警劉巖牢裳,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逢防,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蒲讯,警方通過查閱死者的電腦和手機(jī)忘朝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)判帮,“玉大人局嘁,你說我怎么就攤上這事溉箕。” “怎么了悦昵?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵约巷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我旱捧,道長(zhǎng)独郎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任枚赡,我火速辦了婚禮氓癌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贫橙。我一直安慰自己贪婉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布卢肃。 她就那樣靜靜地躺著疲迂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪莫湘。 梳的紋絲不亂的頭發(fā)上尤蒿,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音幅垮,去河邊找鬼腰池。 笑死,一個(gè)胖子當(dāng)著我的面吹牛忙芒,可吹牛的內(nèi)容都是我干的示弓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼呵萨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奏属!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起潮峦,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤囱皿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后跑杭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铆帽,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咆耿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年德谅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萨螺。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窄做,死狀恐怖愧驱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情椭盏,我是刑警寧澤组砚,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站掏颊,受9級(jí)特大地震影響糟红,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乌叶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一盆偿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧准浴,春花似錦事扭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至葡公,卻和暖如春罐农,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背催什。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工啃匿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛆楞。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓溯乒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親豹爹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裆悄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)臂聋,斷路器光稼,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評(píng)論 25 707
  • 最近由于涉及到短視頻項(xiàng)目,在濾鏡這一塊不可避免會(huì)和OpenGL ES2.0打交道孩等。iOS在這一塊由于GPUImag...
    高小凍閱讀 210評(píng)論 0 0
  • 1橡皮泥 回到家 閨女給我驚喜 用橡皮泥給我做了個(gè)手表 別小看哦 還帶扣滴(? ̄ ?  ̄?) 便于穿戴 是不是很形...
    瑩瑩生輝閱讀 256評(píng)論 0 0
  • 只因那天陽(yáng)光正好肄方,微風(fēng)不燥冰垄。 他那時(shí)嘴角帶著一抹笑,看著我 我看到他眼里只有我权她,我莫名心悸虹茶,聽到心臟砰砰的跳逝薪。 我...
    本寶寶好萌閱讀 182評(píng)論 0 0