python爬蟲抓取新浪微博數據

需求分析

抓取 琢磨先生的新浪微博

微博主頁

抓取的內容包括:微博發布的時間,正文(僅提取文字),轉發數,評論數,點贊數

抓取的內容

數據是怎么加載的

新浪微博的數據是用ajax異步下拉加載的,在chrome的調試模式下可捕捉到相應的請求:

xhr請求

分析這些url的規律:

https://m.weibo.cn/api/container/getIndex?type=uid&value=1665372775&containerid=1076031665372775&page=2
https://m.weibo.cn/api/container/getIndex?type=uid&value=1665372775&containerid=1076031665372775&page=3

發現除了page參數的不同,其他都是一致的

數據的結構分析

json結構分析

返回的json數據結構中,我們需要的是以下字段:

data
  cards
    mblog
      created_at # 發布時間
      text # 正文
      reposts_count # 轉發數
      comments_count # 評論數
      attitudes_count # 點贊數

代碼實現

首先確保安裝了requestspyquery

pip install pyquery
pip install requests

具體代碼解析:

import requests
from urllib.parse import urlencode
from pyquery import PyQuery as pq

host = 'm.weibo.cn'
base_url = 'https://%s/api/container/getIndex?' % host
user_agent = 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 wechatdevtools/0.7.0 MicroMessenger/6.3.9 Language/zh_CN webview/0'

headers = {
    'Host': host,
    'Referer': 'https://m.weibo.cn/u/1665372775',
    'User-Agent': user_agent
}


# 按頁數抓取數據
def get_single_page(page):
    params = {
        'type': 'uid',
        'value': 1665372775,
        'containerid': 1076031665372775,
        '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('抓取錯誤', e.args)


# 解析頁面返回的json數據
def parse_page(json):
    items = json.get('data').get('cards')
    for item in items:
        item = item.get('mblog')
        if item:
            data = {
                'id': item.get('id'),
                'text': pq(item.get("text")).text(),  # 僅提取內容中的文本
                'attitudes': item.get('attitudes_count'),
                'comments': item.get('comments_count'),
                'reposts': item.get('reposts_count')
            }
            yield data


if __name__ == '__main__':
    for page in range(1, 10):  # 抓取前十頁的數據
        json = get_single_page(page)
        results = parse_page(json)
        for result in results:
            print(result)

運行結果

{'id': '4241354777389653', 'text': '【新書預售】\n\n我經常覺得生活就如同唐吉坷德,持一只長矛,去挑戰一個個風車。你越是勇敢,你就越是可笑。我們必須正確認識自己,認識自己手里的兵器,也要認清我們要去挑戰的是何種存在。\n\n這些風車有愛情,有親情,有友誼,有遠行,有閱讀,亦有人性...我把自己跌跌撞撞挑戰過的十八個風車,寫成了 ...全文', 'attitudes': 646, 'comments': 509, 'reposts': 155}
{'id': '4276572205338096', 'text': '雪橇犬,鳥,鯨魚,海豹,冰塊,人(最后一張)。 格陵蘭', 'attitudes': 35, 'comments': 18, 'reposts': 1}
{'id': '4276459473976711', 'text': '北極 微博視頻', 'attitudes': 196, 'comments': 39, 'reposts': 12}
{'id': '4276308663690970', 'text': '真好看,魅力十足//@zhj居安:媽呀!太好看了吧!保持的真好,羨慕呀!', 'attitudes': 379, 'comments': 91, 'reposts': 191}
{'id': '4276172055838171', 'text': '在高鐵渣男這件事上,我覺得乘警也必須要反思,如果不讓座,必須強制執行。如果乘警不作為,個體的乘客如何能解決自己權益收到傷害的情形,難不成都要靠自己的拳頭去解決問題?我們有些執法者的問題在于,該有善意的時候心狠,該心狠的時候又充滿了沒原則的善意。', 'attitudes': 3536, 'comments': 496, 'reposts': 601}
{'id': '4276152610951821', 'text': '惡心至極,不接受那虛偽的道歉,拉入高鐵黑名單吧。//@劉力博士://@楊伯溆:太不可思議了//@芮法:唯物史觀啊,哪有歷史唯物主義史觀之說。作者、編輯、刊物都太丟人了//@記錄者老K:他還是學法律的 查看圖片', 'attitudes': 407, 'comments': 287, 'reposts': 350}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網絡請求組件 FMDB本地數據庫組件 SD...
    陽明AGI閱讀 16,003評論 3 119
  • 3.29. 星期四 可能大喜之后便是大悲。今天與她的交流少得可憐,說了幾句兩只手便可數清。 她最近可能脖子有些...
    患失D閱讀 231評論 0 0
  • 信號與噪聲:大數據時代預測的科學與藝術 作者(Nate Silver[美]納特?西爾弗)是我們《快公司》2013年...
    柯志雄閱讀 1,071評論 0 2
  • 清晨半曉落雨聲,桃紅落地花落塵。 若非昨夜閑涼意,還撫琵琶感桃芬。
    愿濕蓮衫閱讀 341評論 0 2
  • 晚上近八點出了上海虹橋站,天空飄著的不是意想中的雪花,而是不緊不慢的雨星。 一時倒有些不適應:“咦,上海不下雪啊!...
    憑欄仙后閱讀 1,085評論 15 16