Python 抓取微信公眾號賬號信息

prhs7545 8年前發布 | 23K 次閱讀 Python Python開發

搜狗微信搜索提供兩種類型的關鍵詞搜索,一種是搜索公眾號文章內容,另一種是直接搜索微信公眾號。通過微信公眾號搜索可以獲取公眾號的基本信息及最近發布的10條文章,之前寫過一篇《 Python 抓取微信公眾號文章 》,今天來抓取一下微信公眾號的賬號信息( 先看結果(2998條) :查看原文 )。

爬蟲

首先通過首頁進入,可以按照類別抓取,通過“查看更多”可以找出頁面鏈接規則:

import requests as req
import re

reTypes = r'id="pc_\d*" uigs="(pc_\d*)">([\s\S]*?)</a>'
Entry = "http://weixin.sogou.com/"

entryPage = req.get(Entry)
allTypes = re.findall(reTypes, getUTF8(entryPage))
for (pcid, category) in allTypes:
  for page in range(1, 100):
    url = 'http://weixin.sogou.com/pcindex/pc/{}/{}.html'.format(pcid, page)
    print(url)

    categoryList = req.get(url)
    if categoryList.status_code != 200:
      break

上面代碼通過加載更多頁面獲取加載列表,進而從其中抓取微信公眾號詳情頁面:

reProfile = r'<li id[\s\S]*?<a href="([\s\S]*?)"'
allProfiles = re.findall(reOAProfile, getUTF8(categoryList))
for profile in allProfiles:
  profilePage = req.get(profile)
  if profilePage.status_code != 200:
    continue

進入詳情頁面可以獲取公眾號的 名稱/ID/功能介紹/賬號主體/頭像/二維碼/最近10篇文章 等信息:

1. 驗證碼

訪問詳情頁面時有可能需要驗證碼,自動識別驗證碼還是很有難度的,因此要做好爬蟲的偽裝工作。

2. 未保存詳情頁面鏈接

詳情頁面的鏈接中有兩個重要參數: timestamp & signature ,這說明頁面鏈接是有時效性的,所以保存下來應該也沒用;

3. 二維碼

二維碼圖片鏈接同樣具有時效性,因此如需要最好將圖片下載下來。

用 Flask 展示結果

最近 Python 社區出現了一款異步增強版的 Flask 框架: Sanic ,基于 uvloop 和 httptools ,可以達到異步、更快的效果,但保持了與 Flask 一致的簡潔語法。雖然項目剛起步,還有很多基本功能為實現,但已經獲得了很多關注( 2,222 Star )。這次本打算用抓取的微信公眾號信息基于 Sanic 做一個簡單的交互應用,但無奈目前還沒有加入模板功能,異步的 redis 驅動也還有 BUG 沒解決,所以簡單嘗試了一下之后還是切換回 Flask + SQLite,先把抓取結果呈現出來,后續有機會再做更新。

安裝 Sanic

Debug Sanic

Flask + SQLite App

from flask import g, Flask, render_template
import sqlite3

app = Flask(__name__)
DATABASE = "./db/wx.db"

def get_db():
  db = getattr(g, '_database', None)
  if db is None:
    db = g._database = sqlite3.connect(DATABASE)
    return db
@app.teardown_appcontext
def close_connection(exception):
  db = getattr(g, '_database', None)
  if db is not None:
    db.close()
@app.route("/<int:page>")
@app.route("/")
def hello(page=0):
  cur = get_db().cursor()
  cur.execute("SELECT * FROM wxoa LIMIT 30 OFFSET ?", (page*30, ))
  rows = []
  for row in cur.fetchall():
    rows.append(row)
  return render_template("app.html", wx=rows, cp=page)

if __name__ == "__main__":
  app.run(debug=True, port=8000)

 

來自:http://mp.weixin.qq.com/s?__biz=MzI0NjIxMzE5OQ==&mid=2656697912&idx=1&sn=7c43d3c59b265650dd58c25bed18d304&chksm=f2efe118c598680e40393961af060bd1358f9d29b2bc5050cb2e0ca2ce5d9f93eaabea6fcb8a#rd

 

 本文由用戶 prhs7545 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!