芝麻HTTP:Ajax結果提取,芝麻ajax結果提取

來源:互聯網
上載者:User

芝麻HTTP:Ajax結果提取,芝麻ajax結果提取

以微博為例,接下來用Python來類比這些Ajax請求,把我發過的微博爬取下來。

1. 分析請求

開啟Ajax的XHR過濾器,然後一直滑動頁面以載入新的微博內容。可以看到,會不斷有Ajax請求發出。

選定其中一個請求,分析它的參數資訊。點擊該請求,進入詳情頁面,6-11所示。

可以發現,這是一個GET類型的請求,請求連結為[https://m.weibo.cn/api/container/getIndex?type=uid&value=2830678474&containerid=1076032830678474&page=2)。請求的參數有4個:typevaluecontaineridpage

隨後再看看其他請求,可以發現,它們的typevaluecontainerid始終如一。type始終為uidvalue的值就是頁面連結中的數字,其實這就是使用者的id。另外,還有containerid。可以發現,它就是107603加上使用者id。改變的值就是page,很明顯這個參數是用來控制分頁的,page=1代表第一頁,page=2代表第二頁,以此類推。

2. 分析響應

隨後,觀察這個請求的響應內容,6-12所示。

這個內容是JSON格式的,瀏覽器開發人員工具自動做瞭解析以方便我們查看。可以看到,最關鍵的兩部分資訊就是cardlistInfocards:前者包含一個比較重要的資訊total,觀察後可以發現,它其實是微博的總數量,我們可以根據這個數字來估算分頁數;後者則是一個列表,它包含10個元素,展開其中一個看一下,。

可以發現,這個元素有一個比較重要的欄位mblog。展開它,可以發現它包含的正是微博的一些資訊,比如attitudes_count(贊數目)、comments_count(評論數目)、reposts_count(轉寄數目)、created_at(發布時間)、text(微博本文)等,而且它們都是一些格式化的內容。

這樣我們請求一個介面,就可以得到10條微博,而且請求時只需要改變page參數即可。

這樣的話,我們只需要簡單做一個迴圈,就可以擷取所有微博了。

3. 實戰演練

這裡我們用程式類比這些Ajax請求,將我的前10頁微博全部爬取下來。

首先,定義一個方法來擷取每次請求的結果。在請求時,page是一個可變參數,所以我們將它作為方法的參數傳遞進來,相關代碼如下:

from urllib.parse import urlencodeimport requestsbase_url = 'https://m.weibo.cn/api/container/getIndex?'headers = {    'Host': 'm.weibo.cn',    'Referer': 'https://m.weibo.cn/u/2830678474',    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',    'X-Requested-With': 'XMLHttpRequest',}def get_page(page):    params = {        'type': 'uid',        'value': '2830678474',        'containerid': '1076032830678474',        'page': page    }    url = base_url + urlencode(params)    try:        response = requests.get(url, headers=headers)        if response.status_code == 200:            return response.json()    except requests.ConnectionError as e:        print('Error', e.args)

首先,這裡定義了base_url來表示請求的URL的前半部分。接下來,構造參數字典,其中typevaluecontainerid是固定參數,page是可變參數。接下來,調用urlencode()方法將參數轉化為URL的GET請求參數,即類似於type=uid&value=2830678474&containerid=1076032830678474&page=2這樣的形式。隨後,base_url與參數拼合形成一個新的URL。接著,我們用requests請求這個連結,加入headers參數。然後判斷響應的狀態代碼,如果是200,則直接調用json()方法將內容解析為JSON返回,否則不返回任何資訊。如果出現異常,則捕獲並輸出其異常資訊。

隨後,我們需要定義一個解析方法,用來從結果中提取想要的資訊,比如這次想儲存微博的id、本文、贊數、評論數和轉寄數這幾個內容,那麼可以先遍曆cards,然後擷取mblog中的各個資訊,賦值為一個新的字典返回即可:

from pyquery import PyQuery as pqdef parse_page(json):    if json:        items = json.get('data').get('cards')        for item in items:            item = item.get('mblog')            weibo = {}            weibo['id'] = item.get('id')            weibo['text'] = pq(item.get('text')).text()            weibo['attitudes'] = item.get('attitudes_count')            weibo['comments'] = item.get('comments_count')            weibo['reposts'] = item.get('reposts_count')            yield weibo

這裡我們藉助pyquery將本文中的HTML標籤去掉。

最後,遍曆一下page,一共10頁,將提取到的結果列印輸出即可:

if __name__ == '__main__':    for page in range(1, 11):        json = get_page(page)        results = parse_page(json)        for result in results:            print(result)

另外,我們還可以加一個方法將結果儲存到MongoDB資料庫:

from pymongo import MongoClientclient = MongoClient()db = client['weibo']collection = db['weibo']def save_to_mongo(result):    if collection.insert(result):        print('Saved to Mongo')

這樣所有功能就實現完成了。運行程式後,範例輸出結果如下:

{'id': '4134879836735238', 'text': '驚不驚喜,刺不刺激,意不意外,感不感動', 'attitudes': 3, 'comments': 1, 'reposts': 0}Saved to Mongo{'id': '4143853554221385', 'text': '曾經夢想仗劍走天涯,後來過安檢給收走了。分享單曲 遠走高飛', 'attitudes': 5, 'comments': 1, 'reposts': 0}Saved to Mongo

查看一下MongoDB,相應的資料也被儲存到MongoDB,。

這樣,我們就順利通過分析Ajax並編寫爬蟲爬取下來了微博列表,最後,給出本節的代碼地址:https://github.com/Python3WebSpider/WeiboList。

本節的目的是為了示範Ajax的類比請求過程,爬取的結果不是重點。該程式仍有很多可以完善的地方,如頁碼的動態計算、微博查看全文等,若感興趣,可以嘗試一下。

通過這個執行個體,我們主要學會了怎樣去分析Ajax請求,怎樣用程式來類比抓取Ajax請求。瞭解了抓取原理之後,下一節的Ajax實戰演練會更加得心應手。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.