欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2019年02月16日 11:31:08   作者:Waspvae  
這篇文章主要介紹了Python實(shí)現(xiàn)爬取馬云的微博功能,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python模擬ajax請(qǐng)求爬取馬云微博的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下

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

分析請(qǐng)求

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

我們選定其中一個(gè)請(qǐng)求來分析一下它的參數(shù)信息,點(diǎn)擊該請(qǐng)求進(jì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 是用來控制分頁的。

分析響應(yīng)

如圖所示:

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

發(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 微博正文等等,得來全不費(fèi)功夫,而且都是一些格式化的內(nèi)容,所以我們提取信息也更加方便了。

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

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

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

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

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 來表示請(qǐng)求的 URL 的前半部分,接下來構(gòu)造了一個(gè)參數(shù)字典,其中 display、retcode、 type、value、containerid 是固定的參數(shù),只有 page 是可變參數(shù),接下來我們調(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è)解析方法,用來從結(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)

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

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

相關(guān)文章

  • Django添加favicon.ico圖標(biāo)的示例代碼

    Django添加favicon.ico圖標(biāo)的示例代碼

    這篇文章主要介紹了Django添加favicon.ico圖標(biāo)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • python3的一個(gè)天坑問題及解決方法:報(bào)錯(cuò)UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xa3 in position 59: invalid

    python3的一個(gè)天坑問題及解決方法:報(bào)錯(cuò)UnicodeDecodeError: ‘utf-8‘ 

    在調(diào)試程序發(fā)現(xiàn)python3的一個(gè)天坑問題:報(bào)錯(cuò)UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xa3 in position 59: invalid,特此曝光,為眾位開發(fā)朋友提個(gè)醒
    2023-09-09
  • 基于python的Tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)易計(jì)算器

    基于python的Tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)易計(jì)算器

    這篇文章主要介紹了基于python的Tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)易計(jì)算器的相關(guān)資料,還為大家分享了僅用用50行Python代碼實(shí)現(xiàn)的簡(jiǎn)易計(jì)算器,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Python3中詳解fabfile的編寫

    Python3中詳解fabfile的編寫

    這篇文章給大家分享了Python3中詳解fabfile的編寫的相關(guān)知識(shí)點(diǎn)以及重要內(nèi)容,有興趣的朋友跟著學(xué)習(xí)下。
    2018-06-06
  • Python調(diào)用shell命令常用方法(4種)

    Python調(diào)用shell命令常用方法(4種)

    這篇文章主要介紹了Python調(diào)用shell命令常用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Python遠(yuǎn)程開發(fā)環(huán)境部署與調(diào)試過程圖解

    Python遠(yuǎn)程開發(fā)環(huán)境部署與調(diào)試過程圖解

    這篇文章主要介紹了Python遠(yuǎn)程開發(fā)環(huán)境部署與調(diào)試過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python裝飾器與線程結(jié)合提高接口訪問效率方法

    Python裝飾器與線程結(jié)合提高接口訪問效率方法

    這篇文章主要為大家介紹了如何實(shí)現(xiàn)Python裝飾器與線程結(jié)合來提高接口的訪問效率,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • Flask??使用Gunicorn部署服務(wù)介紹

    Flask??使用Gunicorn部署服務(wù)介紹

    這篇文章主要分享了?Flask??使用Gunicorn部署服務(wù)介紹,F(xiàn)lask?雖然自帶?Web?服務(wù)器,但是該服務(wù)器性能較低,是單進(jìn)程單線程模型,原本是供開發(fā)測(cè)試使用。所以我們?cè)谏a(chǎn)環(huán)境中需要使用?Gunicorn?這樣高性能服務(wù)器部署Flask服務(wù),想了解更多內(nèi)容,請(qǐng)參考下面詳細(xì)內(nèi)容
    2021-11-11
  • 對(duì)python 匹配字符串開頭和結(jié)尾的方法詳解

    對(duì)python 匹配字符串開頭和結(jié)尾的方法詳解

    今天小編就為大家分享一篇對(duì)python 匹配字符串開頭和結(jié)尾的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python字典查找數(shù)據(jù)的5個(gè)基礎(chǔ)操作方法

    Python字典查找數(shù)據(jù)的5個(gè)基礎(chǔ)操作方法

    Python字典是另一種可變?nèi)萜髂P?且可存儲(chǔ)任意類型對(duì)象,如字符串、數(shù)字、元組等其他容器模型,下面這篇文章主要給大家介紹了關(guān)于Python字典查找數(shù)據(jù)的5個(gè)基礎(chǔ)操作方法,需要的朋友可以參考下
    2022-06-06

最新評(píng)論