【项目跟进】KnowledgeManager--4--公众号下载

1.公众号文章下载方式

爬到文章后,常见以下几种下载方式。

  1. 保存txt。可读性差
  2. 保存pdf。丢失链接信息,不易二次开发。
  3. 保存原网页。可本地打开,二次爬虫,但有一定技术难度。

2.保存本地可打开原网页难点

实验过程中发现以下几个难点并且解决。

  1. 存在许多多余信息,并且不用的js代码会造成不必要的请求,使打开本地网页速度变慢。解决:只保存id="img-content的div部分和需要的css,需要用的css我已经上传,可在我的资源查看。
  2. 图片。图片地址使用正则表达式得到,下载到本地,然后替换html中的src地址为本地地址。注意,微信文章中的图片以data-src为属性,后面src是js生成的,爬到的html字符串中没有src属性,还需要将data-src替换成src才能用。

直接放代码吧:

from urllib import request, parse
from lxml import html
import requests
from bs4 import BeautifulSoup as bs
import time
import os
import re
import json
import shutil

base_url = 'https://mp.weixin.qq.com/'
css_file_path = os.path.abspath(os.path.dirname(__file__)) + '\\gzh.css'


# 创建文件夹
def mkdir(path, title):
    path = path + title
    isExists = os.path.exists(path)
    if not isExists:
        os.makedirs(path)
    return path


# 获取每个页面代码以及获取页面上的css,js,img路径
def get_source(url, title, base_path):
    html_text = requests.get(url)
    tree = html.fromstring(html_text.text)
    name = tree.xpath('//*[@id="img-content"]')
    html_text = str(html.tostring(name[0]), encoding='utf-8')
    path = mkdir(base_path, title)
    filename = path + '\\' + title + '.html'
    html_source = save_img(path, html_text)
    html_source = '<link type="text/css" rel="styleSheet" href = "gzh.css"/>' + html_source
    # 保存html
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(html_source)
    shutil.copyfile(css_file_path, path + '\\gzh.css')
    print(title + ".html文件保存成功")
    # time.sleep(1)


# 保存img文件
def save_img(path, html_source):
    patternimg = '<img.*?data-src="(.*?)"'
    imgHref = re.compile(patternimg, re.S).findall(html_source)
    for href in imgHref:
        params = parse.parse_qs(parse.urlparse(href).query)
        type_img = params['wx_fmt'][0].split('?')[0] if 'wx_fmt' in params.keys() else 'png'
        img_name = parse.urlparse(href).path.split('/')[-2] + '.' + type_img
        filename = path + '\\' + img_name

        img_source = requests.get(href)
        with open(filename, 'wb') as f:
            f.write(img_source.content)
        print(img_name + " 图像文件保存成功")
        html_source = str.replace(html_source, 'data-src="' + href + '"', 'src="' + img_name + '"')
        # time.sleep(1)
    return html_source


if __name__ == '__main__':
    # gzh_name = 'CVer'
    # # 抓取网址
    # with open(gzh_name + "_article_data.json", "r") as f:
    #     article_list = json.load(f)
    # i = 0
    # for atricle in article_list:
    #
    #     if i < 937:
    #         pass
    #     else:
    #         url = atricle['link']
    #         title = atricle['title']
    #         title = re.sub('[\/:*?"<>|.]', '-', title).strip().rstrip("\\")  # 去掉非法字符
    #         base_url = 'https://mp.weixin.qq.com/'
    #         url = parse.urljoin(base_url, url)
    #         # 文件保存位置
    #         basedir = os.path.abspath(os.path.dirname(__file__)) + '\\CVer\\'
    #         get_source(url, title, basedir)
    #     i += 1

    url = 'https://mp.weixin.qq.com/s?__biz=MzUxNjcxMjQxNg==&mid=2247484182&idx=1&sn=83c8624229dbaaaab5be0009d3dcb74f&chksm=f9a27199ced5f88ff2f435002bb177a3c4c24005d975520f4d889d4f1957ef79dafbe42ada9c#rd'
    title= 'TensorFlow和深度学习入门教程'
    title = re.sub('[\/:*?"<>|.]', '-', title).strip().rstrip("\\")  # 去掉非法字符
    base_url = 'https://mp.weixin.qq.com/'
    url = parse.urljoin(base_url, url)
    # 文件保存位置
    basedir = os.path.abspath(os.path.dirname(__file__)) + '\\CVer\\'
    get_source(url, title, basedir)

有啥问题欢迎关注公众号直接后台问我,博客我不常上,但是公众号有消息推送,我会第一时间回复的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值