使用Python爬取公眾號的合集內容

来源:https://www.cnblogs.com/ZYPLJ/archive/2023/08/06/17609348.html
-Advertisement-
Play Games

# 使用Python爬取公眾號的合集 # 前言 。。。最近老是更新關於博客的文章,很久沒更新其他的了,然後寫一下如何爬取微信公眾號裡面的圖片吧! 先看看微信公眾號的樣子吧: ![image](https://img2023.cnblogs.com/blog/3091176/202308/309117 ...


使用Python爬取公眾號的合集

前言

。。。最近老是更新關於博客的文章,很久沒更新其他的了,然後寫一下如何爬取微信公眾號裡面的圖片吧!

先看看微信公眾號的樣子吧:

image

我爬取的是公眾號的合集內容

講解

首先用手機打開某個圖片公眾號的文章,然後複製鏈接用電腦打開,它的url為:

以下所展示的鏈接都是被我修改了的

https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzDg3MjY3g==&album_id=2646021169516584499&count=10&begin_msgid=2247483683&begin_itemidx=1&is_reverse=1&uin=&key=&pass_ticket=&wxtoken=&devicetype=&clientversion=&__biz=Mzg2MDg3MjY3Mg%3D%3D&appmsg_token=&x5=0&f=json

每個參數的作用

  • action: 操作類型,值為getalbum
  • __biz: 公眾號的唯一標識,值為MzDg3MjY3g==
  • album_id: 相冊的唯一標識,值為2646021169516584499
  • count: 需要獲取的相冊數量,值為10
  • begin_msgid: 開始的消息ID,值為2247483683
  • begin_itemidx: 開始的項目索引,值為1
  • is_reverse: 是否倒序,值為1
  • uin: 用戶uin,值為空。
  • key: 密鑰,值為空。
  • pass_ticket: 通行證,值為空。
  • wxtoken: 微信令牌,值為空。
  • devicetype: 設備類型,值為空。
  • clientversion: 客戶端版本,值為空。
  • appmsg_token: 文章令牌,值為空。
  • x5: x5參數,值為0
  • f: 返回的數據格式,值為json

爬取思路

可以看到文章開頭的圖片,公告號的每篇文章都是能跳轉的,我們爬取圖片肯定也是爬取跳轉之後頁面的圖片,那麼第一件事就是先獲取所有文章的url。然後我的思路是將url爬取後保存到csv文件中,然後再從csv中讀取url進一步解析圖片的位置,然後下載圖片。這就是整體思路。

首先文章列表能夠顯示再網頁上,那它必定是請求後端了的,那麼請求後端我們就能拿到API介面,如圖:

image

可以看到也是成功獲取到了介面,然後裡面返回的列表就是網頁中展示的文章列表了,這就非常好辦了。我們只需要請求這個介面就能獲取到所有文章的url了,然後微信公眾號合集內容的規則就是,獲取最後一條數據的消息ID是下一條數據開始的消息ID,所以當我們爬取到一個列表,假如這個列表有10條數據,那麼第10條數據的msgid就是下一次請求的begin_msgid,這樣就能獲取11-20的數據,依次內推就能獲取所有文章了,之前試過想一次性獲取全部文章,好像不太行,所以用一個迴圈然後去修改begin_msgid參數發送請求就行了。

開爬

爬取文章url

需要用到的庫

import requests
import json
import csv
import time

參數上面已經講過了就不講了。

請求頭的Referer和Cookie,用瀏覽器的開發工具(F12)找到文章請求,然後就能獲取到。

# 設置請求參數
url = 'https://mp.weixin.qq.com/mp/appmsgalbum'

# 設置請求參數
params = {
    'action': 'getalbum',
    '__biz': 'MzDg3MjY3g==',
    'album_id': '2646021169516584499',
    'count': 10,
    'is_reverse': 1, # 為倒敘也就是從第一篇文章開始
    'uin': '',
    'key': '',
    'pass_ticket': '',
    'wxtoken': '',
    'devicetype': '',
    'clientversion': '',
    '__biz': 'MzDg3MjY3g==',
    'appmsg_token': '',
    'x5': 0,
    'f': 'json'
}

# 設置請求頭
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
    'Referer': '',
    'Host': 'mp.weixin.qq.com',
    'Accept-Encoding': 'gzip, deflate',
    'Cookie': ''
}

分段展示代碼

# 設置請求頻率限制
MAX_REQUESTS_PER_MINUTE = 10
REQUEST_INTERVAL = 60 / MAX_REQUESTS_PER_MINUTE

# 發送請求,獲取第一頁相冊內容
response = requests.get(url, params=params, headers=headers)
if response.status_code == 200:
    data = json.loads(response.text)
    album = data['getalbum_resp']['article_list']
    last_msgid = album[-1]['msgid']  # 獲取最後一張圖片的消息ID 用作下次請求的begin_msgid
else:
    print('獲取相冊內容失敗:', response.status_code)
# 迴圈發送請求,獲取所有相冊內容
result = []
while True:
    params['begin_msgid'] = last_msgid
    params['begin_itemidx'] = 1
    print(url)
    response = requests.get(url, params=params, headers=headers)
    if response.status_code == 200:
        data = json.loads(response.text)
        album = data['getalbum_resp']['article_list']
        if len(album) == 0:
            break  # 如果相冊為空,則退出迴圈
        for photo in album:
            # 獲取url和title
            url2 = photo['url']
            title = photo['title']
            result.append({'url': url2, 'title': title})
            # 保存到csv文件中
            with open('blogimg3.csv', 'a', newline='', encoding='utf-8') as f:
                writer = csv.DictWriter(f, fieldnames=['url', 'title'])
                writer.writerow({'url': url2, 'title': title})
            # 控制請求頻率
            time.sleep(REQUEST_INTERVAL)
        last_msgid = album[-1]['msgid']  # 獲取最後一張圖片的消息ID,用於下一次請求
    else:
        print('獲取相冊內容失敗:', response.status_code)
        break

ok 然後坐等爬取完成,我這裡是做了請求限制了的,如果想爬快一點把限制刪掉就行了。

文章爬取結果

image

image

也是爬取完成了,但是爬完之後會報KeyError: 'article_list'的錯誤,這個無關緊要,因為已經請求到最後數據之後的請求了,導致獲取不到這個article_list的json數據了。

image

然後看到上面的圖片是254個內容,但是爬取的鏈接只有244條,數據缺失了幾條,但是程式也沒出現問題,所以就不管了,也就幾條數據,不影響,畢竟找出問題得花大量的時間。

爬取圖片

上面只是爬取了文章的url,現在要進入文章爬取圖片了。

首先,需要用到的庫

import csv
import requests
from lxml import etree
import os
from urllib.parse import urlparse
import time

然後爬取圖片的思路就是解析我們之前爬取的文章url,通過遍歷文章url,去使用xpath去匹配文章裡面的圖片就行了,第一次爬取出現了點小問題,後面會講。

關於Xpath獲取

偷懶方式如下:

image

匹配圖片url函數 download_images

def download_images(url):
    # 設置請求頭
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
        'Referer': '',
        'Host': 'mp.weixin.qq.com',
        'Accept-Encoding': 'gzip, deflate',
        'Cookie': ''
    }

    # 發送請求
    response = requests.get(url, headers=headers)

    # 解析HTML
    html = etree.HTML(response.text)

    # 獲取圖片
    img_elements = html.xpath('//*[@id="js_content"]/section/section[4]/p/img/@data-src')
    if len(img_elements) == 0:
        img_elements = html.xpath('//*[@id="js_content"]/section/section[4]/p/span/img/@data-src')
    print(img_elements)
    # 下載圖片
    for url in img_elements:
        print(f"下載圖片:{url}")
        download_image(url, 'blogimg4_1')

**下載圖片函數 **download_image

# 下載
def download_image(url, img_dir):
     # 解析url
     parsed_url = urlparse(url).path
     wx_fmt = parsed_url.split('/')[1].split('_')[1]
     # 獲取文件名
     filename = url.split('/')[-2] + '.' + wx_fmt
     # 發送請求
     response = requests.get(url)
     # 保存圖片
     with open(os.path.join(img_dir, filename), 'wb') as f:
         f.write(response.content)

main方法

if __name__ == '__main__':
    with open('blogimg3_1.csv',newline='',encoding='utf-8') as f:
        # 讀取csv文件內容
        reader = csv.reader(f)
        # 遍歷每一行
        for row in reader:
            # 提取第一列的url
            url = row[0]
            # 發送請求
            try:
                download_images(url)
            except Exception as e:
                print(f'Error: {e}')
                continue
            time.sleep(2)

圖片爬取結果

image

可以看到有個別圖片沒有正常顯示,那是因為這個公眾號最新的文章圖片url和之前不一樣,我也是爬完才發現,雖然才幾張圖片,但是得優化一下

第一次爬取,爬到了1333張圖片

image

優化下載圖片代碼

download_image函數:

# 解析url
parsed_url = urlparse(url)
path_parts = parsed_url.path.split('/')

# 判斷鏈接特征並提取參數值
if 'wx_fmt' in parsed_url.query:
    wx_fmt = parsed_url.query.split('=')[1]
    # 獲取文件名
    filename = path_parts[-2] + '.' + wx_fmt
elif 'mmbiz_jpg' in path_parts:
    filename = os.path.splitext(path_parts[2])[0] + '.jpg'
elif 'mmbiz_png' in path_parts:
    filename = os.path.splitext(path_parts[2])[0] + '.png'

# 發送請求
response = requests.get(url)
# 保存圖片
with open(os.path.join(img_dir, filename), 'wb') as f:
    f.write(response.content)

優化之後也是沒有出現圖片無法顯示的情況,然後爬取了1368張圖片。

image

聲明

文章出現的代碼只用於學習,不會影響公眾號正常運行,如有侵權,聯繫站長刪除。

爬取下來的圖片將不會保存,望知~

QQ郵箱:[email protected]

結尾

公眾號是沒有反爬機制的,所以爬取下來很容易,不過公眾號放的圖片都不夠高清,但是也還是能看。如果也想學習學習如何爬取的,可以關註公眾號私信我,找我要鏈接。如果有更好的圖片網站,也可以私信我~

image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著硬體技術的飛速發展,多核處理器已經成為計算設備的標配,這使得開發人員需要掌握併發編程的知識和技巧,以充分發揮多核處理器的潛力。然而併發編程並非易事,它涉及到許多複雜的概念和原理。為了更好地理解併發編程的內在機制,需要深入研究記憶體模型及其在併發編程中的應用。本文將主要以 Java 記憶體模型來探討並 ...
  • 最近看到一個冷門的資料庫管理工具:**slashbase**。 這個工具是開源免費的,由於開源不久,目前才900+的Star,但用下來還是非常不錯的,DD覺得這款工具還是非常有潛力的,所以給大家推薦一下。 ## 主要特性 [**slashbase**](https://blog.didispace. ...
  • # 最全的零基礎Flask教程 ## 1 Flask介紹 ### 1.1 為什麼要使用Flask Django和Flask是Python使用最多的兩個框架 ![image-20230802071519906](https://img2023.cnblogs.com/blog/2602103/2023 ...
  • 操作系統 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 之前寫過FreeSWITCH添加自定義endpoint的文章: https://www.cnblogs.com/MikeZhang/p/fsAddEndpoint20230528.html 今天記錄下endpoint ...
  • ## 8.1、場景模擬 ### 8.1.1、UserDao介面及實現類 ![image](https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230806153633915-1785854235.png) ``` package org ...
  • ## Nacos 簡介 Nacos 是一個易於使用的動態服務發現、配置和服務管理平臺,用於構建雲原生的應用程式 Nacos 的關鍵特性包括以下幾項: - 服務發現和服務健康監測:服務提供者使用原生 SDK、OpenAPI 等註冊服務後,服務消費者可以使用 HTTP&API 查找和發現服務。Nacos ...
  • # AtCoder Beginner Contest 313 ## G - Redistribution of Piles ### 題意翻譯: 給定一個數列$a_i(a_i>0, i\in[1,n])$,和一個數$s$(初值為0),有兩種操作 - A - 全局非零數減一,減去的和加到$s$ - B ...
  • ###JDBC使用步驟總結 **1. 註冊驅動** ``` Class.forName("com.mysql.cj.jdbc.Driver"); ``` **2. 獲取鏈接** ``` Connection connection = DriverManager.getConnection(url,u ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...