Python3 使用beautifulsoup解析微信文章

Posted 起名字是很难的事

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 使用beautifulsoup解析微信文章相关的知识,希望对你有一定的参考价值。

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() #公众号描述

 

以上是关于Python3 使用beautifulsoup解析微信文章的主要内容,如果未能解决你的问题,请参考以下文章

Python3.x:BeautifulSoup()解析网页内容出现乱码

Python3 使用beautifulsoup解析微信文章

Python3 使用beautifulsoup解析微信文章

Python3 使用beautifulsoup解析微信文章

python3 BeautifulSoup模块

Python3 BeautifulSoup和Pyquery解析库随笔