亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久

總結:帶大家寫(xiě)一波微信公眾號的爬??!誰(shuí)說(shuō)微信爬不了的

優(yōu)采云 發(fā)布時(shí)間: 2020-10-22 08:01

  帶大家去寫(xiě)一波微信公眾號爬網(wǎng)!誰(shuí)說(shuō)微信無(wú)法攀登

  x5

  其他參數的含義可以根據經(jīng)驗和簡(jiǎn)單的測試來(lái)判斷:

  1.偏移

  控制翻頁(yè)的偏移參數

  2.個(gè)計數

  每頁(yè)文章的數量

  3.__ biz

  官方帳戶(hù)標識,不同的__biz對應于不同的官方帳戶(hù)

  4.pass_ticket

  它應該是微信登錄后返回的參數,

  去年我嘗試登錄微信網(wǎng)絡(luò )版本時(shí),在返回的參數中看到了它,

  但是現在微信網(wǎng)絡(luò )版本已被正式禁止T_T。

  5.appmsg_token

  它還應該是登錄微信后的標識參數,以及您閱讀的微信官方帳戶(hù)

  相關(guān),查看不同的微信公眾號時(shí)的值也不同。

  前三個(gè)變量參數很容易求解,但后兩個(gè)參數似乎更難。但是,在測試之后,我們可以發(fā)現pass_ticket實(shí)際上是一個(gè)可選參數,因此我們可以忽略它。而且appmsg_token的有效期至少為10個(gè)小時(shí),這段時(shí)間足以讓我們抓取目標官方帳戶(hù)的所有文章,因此只需直接將其復制,就無(wú)需浪費時(shí)間分析這些東西(您也應該知道您是否認為騰訊對白人賣(mài)淫(T_T)絕對不那么容易。編寫(xiě)一段代碼對其進(jìn)行簡(jiǎn)短測試:

  import requests

session = requests.Session()

session.headers.update(headers)

session.cookies.update(cookies)

profile_url = '前面抓包得到的請求地址'

biz = 'MzAwNTA5NTYxOA=='

pass_ticket = ''

appmsg_token = '1055_YAmuAw2QG7dM3aTwSVZVqgtRdct6ilAMTwlz7g'

params = {

'action': 'getmsg',

'__biz': biz,

'f': 'json',

'offset': '0',

'count': '10',

'is_ok': '1',

'scene': '123',

'uin': '777',

'key': '777',

'pass_ticket': pass_ticket,

'wxtoken': '',

'appmsg_token': appmsg_token,

'x5': '0'

}

res = session.get(profile_url, params=params, verify=False)

print(res.text)

  運行后,您會(huì )發(fā)現返回的數據如下:

  

  似乎沒(méi)有問(wèn)題。重新調整打包代碼以爬網(wǎng)正式帳戶(hù)的所有文章鏈接。具體來(lái)說(shuō),核心代碼實(shí)現如下:

  '''獲得所有文章的鏈接'''

def __getArticleLinks(self):

print('[INFO]: 正在獲取目標公眾號的所有文章鏈接...')

fp = open('links_tmp.json', 'w', encoding='utf-8')

article_infos = {}

params = {

'action': 'getmsg',

'__biz': self.cfg.biz,

'f': 'json',

'offset': '0',

'count': '10',

'is_ok': '1',

'scene': '123',

'uin': '777',

'key': '777',

'pass_ticket': self.cfg.pass_ticket,

'wxtoken': '',

'appmsg_token': self.cfg.appmsg_token,

'x5': '0'

}

while True:

res = self.session.get(self.profile_url, params=params, verify=False)

res_json = res.json()

can_msg_continue = res_json.get('can_msg_continue', '')

next_offset = res_json.get('next_offset', 10)

general_msg_list = json.loads(res_json.get('general_msg_list', '{}'))

params.update({'offset': next_offset})

for item in general_msg_list['list']:

app_msg_ext_info = item.get('app_msg_ext_info', {})

if not app_msg_ext_info: continue

title = app_msg_ext_info.get('title', '')

content_url = app_msg_ext_info.get('content_url', '')

if title and content_url:

article_infos[title] = content_url

if app_msg_ext_info.get('is_multi', '') == 1:

for article in app_msg_ext_info.get('multi_app_msg_item_list', []):

title = article.get('title', '')

content_url = article.get('content_url', '')

if title and content_url:

article_infos[title] = content_url

if can_msg_continue != 1: break

else: time.sleep(1+random.random())

json.dump(article_infos, fp)

fp.close()

print('[INFO]: 已成功獲取目標公眾號的所有文章鏈接, 數量為%s...' % len(list(article_infos.keys())))

  運行后,我們可以獲得目標官方帳戶(hù)的所有文章鏈接:

  

  

  現在,我們只需要基于這些文章鏈接來(lái)抓取文章的內容。在這里,我們使用python的第三方軟件包pdfkit將每篇文章文章保存為pdf文件。具體來(lái)說(shuō),核心代碼實(shí)現如下:

  '''下載所有文章'''

def __downloadArticles(self):

print('[INFO]: 開(kāi)始爬取目標公眾號的所有文章內容...')

if not os.path.exists(self.savedir):

os.mkdir(self.savedir)

fp = open('links_tmp.json', 'r', encoding='utf-8')

article_infos = json.load(fp)

for key, value in article_infos.items():

print('[INFO]: 正在抓取文章 ——> %s' % key)

pdfkit.from_url(value, os.path.join(self.savedir, key+'.pdf'), configuration=pdfkit.configuration(wkhtmltopdf=self.cfg.wkhtmltopdf_path))

print('[INFO]: 已成功爬取目標公眾號的所有文章內容...')

  請注意,在使用pdfkit之前,您需要安裝wkhtmltox。如下圖所示:

  

  運行的效果可能是這樣的:

  

  

  所有源代碼

  根據您自己的數據包捕獲結果修改cfg.py文件:

  ## cfg.py

# 目標公眾號標識

biz = 'MzAwNTA5NTYxOA=='

# 微信登錄后的一些標識參數

pass_ticket = ''

appmsg_token = '1055_YAmuAw2QG7dM3aTwSVZVqgtRdct6ilAMTwlz7g~~'

# 安裝的wkhtmltopdf.exe文件路徑

wkhtmltopdf_path = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'

12345678

  ## articlesSpider.py

import os

import time

import json

import pdfkit

import random

import requests

import warnings

warnings.filterwarnings('ignore')

'''微信公眾號文章爬取類(lèi)'''

class articlesSpider(object):

def __init__(self, cfg, **kwargs):

self.cfg = cfg

self.session = requests.Session()

self.__initialize()

'''外部調用'''

def run(self):

self.__getArticleLinks()

self.__downloadArticles()

'''獲得所有文章的鏈接'''

def __getArticleLinks(self):

print('[INFO]: 正在獲取目標公眾號的所有文章鏈接...')

fp = open('links_tmp.json', 'w', encoding='utf-8')

article_infos = {}

params = {

'action': 'getmsg',

'__biz': self.cfg.biz,

'f': 'json',

'offset': '0',

'count': '10',

'is_ok': '1',

'scene': '123',

'uin': '777',

'key': '777',

'pass_ticket': self.cfg.pass_ticket,

'wxtoken': '',

'appmsg_token': self.cfg.appmsg_token,

'x5': '0'

}

while True:

res = self.session.get(self.profile_url, params=params, verify=False)

res_json = res.json()

can_msg_continue = res_json.get('can_msg_continue', '')

next_offset = res_json.get('next_offset', 10)

general_msg_list = json.loads(res_json.get('general_msg_list', '{}'))

params.update({'offset': next_offset})

for item in general_msg_list['list']:

app_msg_ext_info = item.get('app_msg_ext_info', {})

if not app_msg_ext_info: continue

title = app_msg_ext_info.get('title', '')

content_url = app_msg_ext_info.get('content_url', '')

if title and content_url:

article_infos[title] = content_url

if app_msg_ext_info.get('is_multi', '') == 1:

for article in app_msg_ext_info.get('multi_app_msg_item_list', []):

title = article.get('title', '')

content_url = article.get('content_url', '')

if title and content_url:

article_infos[title] = content_url

if can_msg_continue != 1: break

else: time.sleep(1+random.random())

json.dump(article_infos, fp)

fp.close()

print('[INFO]: 已成功獲取目標公眾號的所有文章鏈接, 數量為%s...' % len(list(article_infos.keys())))

'''下載所有文章'''

def __downloadArticles(self):

print('[INFO]: 開(kāi)始爬取目標公眾號的所有文章內容...')

if not os.path.exists(self.savedir):

os.mkdir(self.savedir)

fp = open('links_tmp.json', 'r', encoding='utf-8')

article_infos = json.load(fp)

for key, value in article_infos.items():

print('[INFO]: 正在抓取文章 ——> %s' % key)

key = key.replace('\', '').replace('/', '').replace(':', '').replace(':', '') \

.replace('*', '').replace('?', '').replace('?', '').replace('“', '') \

.replace('"', '').replace('', '').replace('|', '_')

pdfkit.from_url(value, os.path.join(self.savedir, key+'.pdf'), configuration=pdfkit.configuration(wkhtmltopdf=self.cfg.wkhtmltopdf_path))

print('[INFO]: 已成功爬取目標公眾號的所有文章內容...')

'''類(lèi)初始化'''

def __initialize(self):

self.headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1295.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat'

}

self.cookies = {

'wxuin': '913366226',

'devicetype': 'iPhoneiOS13.3.1',

'version': '17000c27',

'lang': 'zh_CN',

'pass_ticket': self.cfg.pass_ticket,

'wap_sid2': 'CNK5w7MDElxvQU1fdWNuU05qNV9lb2t3cEkzNk12ZHBsNmdXX3FETlplNUVTNzVfRmwyUUtKZzN4QkxJRUZIYkMtMkZ1SDU5S0FWQmtSNk9mTTQ1Q1NDOXpUYnJQaDhFQUFBfjDX5LD0BTgNQJVO'

}

self.profile_url = 'https://mp.weixin.qq.com/mp/profile_ext'

self.savedir = 'articles'

self.session.headers.update(self.headers)

self.session.cookies.update(self.cookies)

'''run'''

if __name__ == '__main__':

import cfg

spider = articlesSpider(cfg)

spider.run()

  要簡(jiǎn)單。如果不能的話(huà),請將我添加到企鵝群組中,以接收視頻教程和源代碼。私人消息編輯器01

0 個(gè)評論

要回復文章請先登錄注冊


官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久