1.公众号文章下载方式
爬到文章后,常见以下几种下载方式。
- 保存txt。可读性差
- 保存pdf。丢失链接信息,不易二次开发。
- 保存原网页。可本地打开,二次爬虫,但有一定技术难度。
2.保存本地可打开原网页难点
实验过程中发现以下几个难点并且解决。
- 存在许多多余信息,并且不用的js代码会造成不必要的请求,使打开本地网页速度变慢。解决:只保存id="img-content的div部分和需要的css,需要用的css我已经上传,可在我的资源查看。
- 图片。图片地址使用正则表达式得到,下载到本地,然后替换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)
有啥问题欢迎关注公众号直接后台问我,博客我不常上,但是公众号有消息推送,我会第一时间回复的。