溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python實(shí)現(xiàn)爬取馬云的微博功能示例

發(fā)布時(shí)間:2020-08-30 09:13:28 來(lái)源:腳本之家 閱讀:218 作者:Waspvae 欄目:開發(fā)技術(shù)

本文實(shí)例講述了Python實(shí)現(xiàn)爬取馬云的微博功能。分享給大家供大家參考,具體如下:

分析請(qǐng)求

我們打開 Ajax 的 XHR 過濾器,然后一直滑動(dòng)頁(yè)面加載新的微博內(nèi)容,可以看到會(huì)不斷有Ajax請(qǐng)求發(fā)出。

我們選定其中一個(gè)請(qǐng)求來(lái)分析一下它的參數(shù)信息,點(diǎn)擊該請(qǐng)求進(jìn)入詳情頁(yè)面,如圖所示:

Python實(shí)現(xiàn)爬取馬云的微博功能示例

可以發(fā)現(xiàn)這是一個(gè) GET 請(qǐng)求,請(qǐng)求的參數(shù)有 6 個(gè):display、retcode、type、value、containerid 和 page,觀察這些請(qǐng)求可以發(fā)現(xiàn)只有 page 在變化,很明顯 page 是用來(lái)控制分頁(yè)的。

分析響應(yīng)

如圖所示:

Python實(shí)現(xiàn)爬取馬云的微博功能示例

它是一個(gè) Json 格式,瀏覽器開發(fā)者工具自動(dòng)為做了解析方便我們查看,可以看到最關(guān)鍵的兩部分信息就是 cardlistInfo 和 cards,將二者展開,cardlistInfo 里面包含了一個(gè)比較重要的信息就是 total,經(jīng)過觀察后發(fā)現(xiàn)其實(shí)它是微博的總數(shù)量,我們可以根據(jù)這個(gè)數(shù)字來(lái)估算出分頁(yè)的數(shù)目。

Python實(shí)現(xiàn)爬取馬云的微博功能示例

發(fā)現(xiàn)它又有一個(gè)比較重要的字段,叫做 mblog,繼續(xù)把它展開,發(fā)現(xiàn)它包含的正是微博的一些信息。比如 attitudes_count 贊數(shù)目、comments_count 評(píng)論數(shù)目、reposts_count 轉(zhuǎn)發(fā)數(shù)目、created_at 發(fā)布時(shí)間、text 微博正文等等,得來(lái)全不費(fèi)功夫,而且都是一些格式化的內(nèi)容,所以我們提取信息也更加方便了。

這樣我們可以請(qǐng)求一個(gè)接口就得到 10 條微博,而且請(qǐng)求的時(shí)候只需要改變 page 參數(shù)即可。這樣我們只需要簡(jiǎn)單做一個(gè)循環(huán)就可以獲取到所有的微博了。

實(shí)戰(zhàn)演練

在這里我們就開始用程序來(lái)模擬這些 Ajax 請(qǐng)求,將馬云的所有微博全部爬取下來(lái)。

首先我們定義一個(gè)方法,來(lái)獲取每次請(qǐng)求的結(jié)果,在請(qǐng)求時(shí)page 是一個(gè)可變參數(shù),所以我們將它作為方法的參數(shù)傳遞進(jìn)來(lái),代碼如下:

from urllib.parse import urlencode
import requests
base_url = 'https://m.weibo.cn/api/container/getIndex?'
headers = {
  'Host': 'm.weibo.cn',
  'Referer': 'https://m.weibo.cn/u/2145291155',
  '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 = {
    'display': '0',
    'retcode': '6102',
    'type': 'uid',
    'value': '2145291155',
    'containerid': '1076032145291155',
    '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)

首先在這里我們定義了一個(gè) base_url 來(lái)表示請(qǐng)求的 URL 的前半部分,接下來(lái)構(gòu)造了一個(gè)參數(shù)字典,其中 display、retcode、 type、value、containerid 是固定的參數(shù),只有 page 是可變參數(shù),接下來(lái)我們調(diào)用了 urlencode() 方法將參數(shù)轉(zhuǎn)化為 URL 的 GET請(qǐng)求參數(shù),即類似于display=0&retcode=6102&type=uid&value=2145291155&containerid=1076032145291155&page=2 這樣的形式,隨后 base_url 與參數(shù)拼合形成一個(gè)新的 URL,然后我們用 Requests 請(qǐng)求這個(gè)鏈接,加入 headers 參數(shù),然后判斷響應(yīng)的狀態(tài)碼,如果是200,則直接調(diào)用 json() 方法將內(nèi)容解析為 Json 返回,否則不返回任何信息,如果出現(xiàn)異常則捕獲并輸出其異常信息。

隨后我們需要定義一個(gè)解析方法,用來(lái)從結(jié)果中提取我們想要的信息,比如我們這次想保存微博的 正文、贊數(shù)、評(píng)論數(shù)、轉(zhuǎn)發(fā)數(shù)這幾個(gè)內(nèi)容,那可以先將 cards 遍歷,然后獲取 mblog 中的各個(gè)信息,賦值為一個(gè)新的字典返回即可。

from pyquery import PyQuery as pq
def parse_page(json):
  if json:
    items = json.get('cards')
    for item in items:
      item = item.get('mblog')
      weibo = {}
      weibo['微博內(nèi)容:'] = pq(item.get('text')).text()
      weibo['轉(zhuǎn)發(fā)數(shù)'] = item.get('attitudes_count')
      weibo['評(píng)論數(shù)'] = item.get('comments_count')
      weibo['點(diǎn)贊數(shù)'] = item.get('reposts_count')
      yield weibo

在這里我們借助于 PyQuery 將正文中的 HTML 標(biāo)簽去除掉。

最后我們遍歷一下 page,將提取到的結(jié)果打印輸出即可。

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

另外我們還可以加一個(gè)方法將結(jié)果保存到 本地 TXT 文件中。

def save_to_txt(result):
  with open('馬云的微博.txt', 'a', encoding='utf-8') as file:
    file.write(str(result) + '\n')

代碼整理

import requests
from urllib.parse import urlencode
from pyquery import PyQuery as pq
base_url = 'https://m.weibo.cn/api/container/getIndex?'
headers = {
  'Host': 'm.weibo.cn',
  'Referer': 'https://m.weibo.cn/u/2145291155',
  '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',
}
max_page = 50
def get_page(page):
  params = {
    'display': '0',
    'retcode': '6102',
    'type': 'uid',
    'value': '2145291155',
    'containerid': '1076032145291155',
    'page': page
  }
  url = base_url + urlencode(params)
  try:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
      return response.json(), page
  except requests.ConnectionError as e:
    print('Error', e.args)
def parse_page(json, page: int):
  if json:
    items = json.get('data').get('cards')
    for index, item in enumerate(items):
      if page == 1 and index == 1:
        continue
      else:
        item = item.get('mblog')
        weibo = {}
        weibo['微博內(nèi)容:'] = pq(item.get('text')).text()
        weibo['轉(zhuǎn)發(fā)數(shù):'] = item.get('attitudes_count')
        weibo['評(píng)論數(shù):'] = item.get('comments_count')
        weibo['點(diǎn)贊數(shù):'] = item.get('reposts_count')
        yield weibo
def save_to_txt(result):
  with open('馬云的微博.txt', 'a', encoding='utf-8') as file:
    file.write(str(result) + '\n')
if __name__ == '__main__':
  for page in range(1, max_page + 1):
    json = get_page(page)
    results = parse_page(*json)
    for result in results:
      print(result)
      save_to_txt(result)

最后結(jié)果為:

{'微博內(nèi)容:': '公安部?jī)和й櫺畔⒕o急發(fā)布平臺(tái),現(xiàn)在有了階段性成果。上線兩年時(shí)間,發(fā)布3053名兒童失蹤信息,找回兒童2980名,找回率97.6%……失蹤兒童信息會(huì)觸達(dá)到幾乎每一個(gè)有手機(jī)的用戶,這對(duì)拐賣兒童的犯罪分子更是巨大的震懾!\n為找回孩子的家長(zhǎng)欣慰,為這個(gè)“互聯(lián)網(wǎng)+打拐”平臺(tái)的創(chuàng)建而感動(dòng),也 ...全文', '轉(zhuǎn)發(fā)數(shù):': 82727, '評(píng)論數(shù):': 9756, '點(diǎn)贊數(shù):': 18091}
{'微博內(nèi)容:': '#馬云鄉(xiāng)村教師獎(jiǎng)#說個(gè)喜事:馬云鄉(xiāng)村教師獎(jiǎng)的獲獎(jiǎng)老師丁茂洲,元旦新婚,新娘也是一名教師。丁老師坦白,他是2015年得了鄉(xiāng)村教師獎(jiǎng)以后,才被現(xiàn)在的女朋友給“瞄上的”。其實(shí)馬云鄉(xiāng)村教師獎(jiǎng),不光女朋友喜歡,重要的是丈母娘也喜歡!\n丁老師的學(xué)校,陜西安康市三星小學(xué),在一個(gè)貧困 ...全文', '轉(zhuǎn)發(fā)數(shù):': 37030, '評(píng)論數(shù):': 8176, '點(diǎn)贊數(shù):': 3931}
{'微博內(nèi)容:': '雙十一結(jié)束了,想對(duì)300萬(wàn)快遞員、對(duì)所有物流合作伙伴說聲謝謝!你們創(chuàng)造了世界商業(yè)的奇跡!雙十一的三天里產(chǎn)生了10億多個(gè)包裹,菜鳥網(wǎng)絡(luò)用了一周的時(shí)間送完,抵達(dá)世界各個(gè)角落,這是世界貨運(yùn)業(yè)的奇跡,更是商業(yè)世界協(xié)同合作的奇跡。10年前,我們不敢想象中國(guó)快遞 ...全文', '轉(zhuǎn)發(fā)數(shù):': 85224, '評(píng)論數(shù):': 21615, '點(diǎn)贊數(shù):': 5044}
{'微博內(nèi)容:': '今晚11.11,準(zhǔn)備好了嗎?注意休息,開心快樂。姑娘們,今晚是你們的節(jié)日。男人們,反正錢是用來(lái)花的,花錢不心疼的日子只有今天!', '轉(zhuǎn)發(fā)數(shù):': 76803, '評(píng)論數(shù):': 22068, '點(diǎn)贊數(shù):': 4773}

本文參考崔慶才的《python3 網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)》。

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python Socket編程技巧總結(jié)》、《Python正則表達(dá)式用法總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI