1.微信文章內容結構分析
注:只能采集圖文文章,視頻、語音無法采集
1)分享相關
<meta property="og:title" content="微信分享標題" />
<meta property="og:url" content="分享鏈接" />
<meta property="og:image" content="分享圖片url" />
<meta property="og:description" content="分享描述" />
2)文章結構
<body id="activity-detail" class="zh_CN wx_wap_page appmsg_desktop_fontsize_2 mm_appmsg discuss_tab appmsg_skin_default appmsg_style_default ">
<!--body的id為activity-detail-->
<div id="js_article" class="rich_media">
<!--js_article用來存盤文章資訊-->
<div id="js_top_ad_area" class="top_banner"></div>
<div class="rich_media_inner">
<div id="page-content" class="rich_media_area_primary">
<div id="img-content" class="rich_media_wrp">
<h2 class="rich_media_title" id="activity-name"></h2>
<!--文章標題,id="activity-name"-->
<div id="meta_content" class="rich_media_meta_list">
<div id="js_tags" class="article-tag__list" style="display: none;" data-len="0">
<div class="rich_media_content " id="js_content" style="visibility: visible;">
<!--正文內容,id="js-content"-->
<div id="js_sponsor_ad_area" style="display: none;"></div>
<div class="read-more__area" id="js_more_read_area" style="display:none;">
<div id="js_tags_preview_toast" class="article-tag__error-tips" style="display: none;">預覽時標簽不可點</div>
<ul id="js_hotspot_area" class="article_extend_area"></ul>
<div id="js_album_keep_read" class="appmsg_card_context album_read_card" style="display: none;">
<div class="rich_media_tool" id="js_toobar3">
<div class="like_comment_wrp" id="js_like_comment" style="display: none;">
<div style="display:none;" id="wow_close_inform">
<div id="js_like_toast" style="display: none;">
<div style="display: none;" id="js_comment_panel">
<div id="js_loading" style="display: none;">
<div class="rich_media_area_primary sougou" id="sg_tj" style="display:none"></div>
<div class="rich_media_area_extra">
<div id="js_pc_qr_code" class="qr_code_pc_outer" style="display: block;">
3)作者資訊
<!-- 公眾號作者資訊 -->
<div id="meta_content" class="rich_media_meta_list">
<span class="rich_media_meta rich_media_meta_text">直播課代表小團長</span> <!--作者名字,可能沒有 -->
<span class="rich_media_meta rich_media_meta_nickname" id="profileBt">
<a href="javascript:void(0);" id="js_name">公眾號名稱</a>
<div id="js_profile_qrcode" class="profile_container" style="display:none;">
<!-- 公眾號資訊 -->
<div class="profile_inner">
<strong class="profile_nickname">公眾號名字</strong>
<img class="profile_avatar" id="js_profile_qrcode_img" src="" alt="">
<p class="profile_meta">
<label class="profile_meta_label">微信號</label>
<span class="profile_meta_value">rmrbwx</span><!--公眾號的微信號 -->
</p>
<p class="profile_meta">
<label class="profile_meta_label">功能介紹</label>
<span class="profile_meta_value">參與、溝通、記錄時代,</span> <!--公眾號的功能描述 -->
</p>
</div>
<span class="profile_arrow_wrp" id="js_profile_arrow_wrp">
<i class="profile_arrow arrow_out"></i>
<i class="profile_arrow arrow_in"></i>
</span>
</div>
</span>
<em id="publish_time" class="rich_media_meta rich_media_meta_text"></em>
</div>
公眾號及作者資訊:在<div id="meta_content">中,
文章作者
(有的文章可能沒有設定作者,非原創標志):<div id="meta_content">-----<span class="rich_media_meta rich_media_meta_text">
<span class="rich_media_meta rich_media_meta_text">直播課代表小團長</span>
(認證了“原創”的文章的作者)<div id="meta_content">-----<span class="rich_media_meta rich_media_meta_text">------<div id="js_author_name">
<span class="rich_media_meta rich_media_meta_text">
<span id="js_author_name" class="" datarewardsn="" datatimestamp=""datacanreward="0">作者名字</span> </span>
公眾號名稱:<div id="meta_content">----- <span id="profileBt">------ <a id="js_name">
公眾號的微信號:<div id="meta_content">----- <span id="profileBt">------<div js_profile_qrcode> ------<p class="profile_meta">(第一個)------<span class="profile_meta_value">
公眾號的介紹:<div id="meta_content">----- <span id="profileBt">------<div js_profile_qrcode> ----<div class="profile_inner">------<p class="profile_meta">(第二個)------<span class="profile_meta_value">

2.開始采集
1)獲取文章源代碼:
import requests
from bs4 import BeautifulSoup
html=requests.get(url).text #采集文章內容
soup = BeautifulSoup(html, 'lxml') #建一個BeautifulSoup物件

2)分享資訊
# share_title = soup.find_all(property='og:title') #分享標題,回傳的串列,實際中只有一條,用find()更合適
share_title = soup.find(property='og:title') #分享標題行
share_title_con = share_title.get('content') #分享標題文本
# print(share_title_con)
share_url = soup.find(property='og:url') #分享url行
share_url_con = share_url.get('content') #分享url地址文本
# print(share_url_con)
share_desc = soup.find(property='og:description') #分享描述行
share_desc_con = share_desc.get('content') #分享描述文本
# print(share_desc_con)
share_img = soup.find(property='og:image') #分享頭圖行
share_img_con = share_img.get('content') #分享頭圖地址,微信有防盜鏈機制,所以圖片需要下載到本地
3)內容處理
文章有效內容在<body id="activity-detail'>中
body = soup.find(id='activity-detail') #body
標題(id='activity-name'),內容(id='activity-name')
title = body.find(id='activity-name') #標題(帶html標簽的內容)
title_txt = title.get_text() #標題的文本
tags = body.find(id='js_tags') #話題(帶html標簽),有的文章在標題作者與正文中間,有一組收錄于**話題
content = body.find(id="js_content") #文章正文內容
print(content.prettify()) #格式化輸出內容
圖片處理
1.微信文章的圖片設定了延遲加載,真正的圖片地址保存在<img data-src="">中;
2.圖片有防盜鏈機制,不能直接使用原檔案地址,需要保存到本地,
imgs = content.find_all('img') #文章中的所有圖片
for img in imgs:
if img.get('data-src'):
new_src = download_img(img.get('data-src'))[0]
img['data-src'] = new_src #前端圖片展示時需要用延遲加載
print(img)
import urllib.request as request
import os
from hashlib import sha1
def download_img(imgurl):
#將圖片保存到本地
path = '/home/wang/images/'
if not os.path.exists(path):
os.makedirs(path)
s1 = sha1() #創建sha1加密物件
s1.update(imgurl.encode("utf-8"))
_imgurl = s1.hexdigest()
imgpath = path + '//' + _imgurl
#imgpath = path + '//' + os.path.split(imgurl)[1]
local_img_url = request.urlretrieve(imgurl, imgpath)
return local_img_url
4)公眾號及作者資訊處理
name = soup.select('#meta_content > span.rich_media_meta_text')
if len(name) > 0:
author_name = name[0].get_text() #作者名字
print(author_name)
公眾號資訊
#直接soup篩選公眾號名字
wx_account_name = soup.select('#meta_content > #profileBt > #js_name')[0].get_text() #微信公眾號的名字
wx_account = soup.find(id="meta_content")
wx_account_name = wx_account.select('#profileBt > #js_name')[0].get_text() #微信公眾號的名字
wx_account_content = wx_account.select('#profileBt > #js_profile_qrcode > .profile_inner > .profile_meta') #獲得串列,內容依次為公眾號微信名,公眾號描述
wx_account_account = wx_account_content[0].select('.profile_meta_value')[0].get_text() #公眾號微信名
wx_account_desc = wx_account_content[1].select('.profile_meta_value')[0].get_text() #公眾號描述
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286716.html
標籤:其他
