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

ps:課前規(guī)矩,ps一下。上節(jié)我們講了最簡單的爬蟲,但是在真實(shí)的網(wǎng)絡(luò)環(huán)境下,并不是所有的網(wǎng)頁都能用那樣的方式抓取,用ajax異步請求數(shù)據(jù)的網(wǎng)頁就沒辦法用如上方式,那么我們今天就來看看如何抓取異步加載數(shù)據(jù)的網(wǎng)頁。(找網(wǎng)頁的時(shí)候發(fā)現(xià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é)人分頁,如果直接通過requests.get('http://www.guokr.com/scientific/')你會發(fā)現(xiàn)我們要的數(shù)據(jù)都不在返回網(wǎng)頁源代碼中,這是因?yàn)槲覀円臄?shù)據(jù)都是通過ajax的方式異步加載的。那我們應(yīng)該如何抓取這部分內(nèi)容呢?首先用瀏覽器打開我們要抓的網(wǎng)頁

1.png

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

2.png

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

3.png

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


4.png

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

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

import json
import pymongo

json庫是python自帶的json解析庫,功能夠我們使用的。pymongo是python和mongoDB交互用的庫。首先我們來看這段代碼:

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

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

接下來:

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

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


5.png

我們可以看到和我們在火狐瀏覽器中的數(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中任意取用,操作簡單。不用做數(shù)據(jù)序列化操作,而我們上節(jié)那樣解析出來的數(shù)據(jù)要存入數(shù)據(jù)庫就需要做序列化操作。

下來時(shí)代碼執(zhí)行完畢后數(shù)據(jù)庫的情況,可以看到我們的數(shù)據(jù)已經(jīng)盡數(shù)插入數(shù)據(jù)庫
![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)頁都需要我們?nèi)ネㄟ^觀察法獲取url然后再采集,這樣豈不是會很累,下節(jié)將向大家介紹一種非常舒服的方式去做這件事。

寫在最后

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容