所以我就想有什么方法能否将这些公众号文章下载下来。这样的话,看起来也方便。但是网上的方法要么太复杂(对于我这个爬虫入门新手来说),要么付费。

但我的需求其实却很简单——“方便的查找 / 检索 / 浏览相关公众号的任意文章”,所以,一番学习检索后,上手做了一个小工具(打包成可执行文件了),虽然方法和代码相当简单,但实际上手用起来还是挺方便的。也给身边伙伴安利了几波。

工具需求:

输入:给定公众号ID,和用户需要获取的公众号文章目录页码数(小于已发布最大收录页数)

( 输出Ⅰ:每个公众号历史文章信息csv文件(链接 标题)

输出Ⅱ: wkhtmltopdf和pdfkit将html转换成PDF文件或者图片文件(初稿)

现有方案

之前在网上也搜索了些爬取微信公众号的资料,大概有如下几种

selenium爬取流程安装python selenium自动模块,通过selenium中的webdriver驱动浏览器获取Cookie登录微信公众号后台;

使用webdriver功能需要安装对应浏览器的驱动插件

注意:谷歌浏览器版本和chromedriver需要对应,否则会导致启动时报错。

微信公众号登陆地址:https://mp.weixin.qq.com/

微信公众号文章接口地址可以在微信公众号后台中新建图文消息,超链接功能中获取:

搜索公众号名称

获取要爬取的公众号的fakeid

选定要爬取的公众号,获取文章接口地址

文章列表翻页及内容获取

AnyProxy代理批量采集

1、一个微信客户端:可以是一台手机安装了微信的app,或者是用电脑中的安卓模拟器。

2、一个微信个人号:为了采集内容不仅需要微信客户端,还要有一个微信个人号专门用于采集。

3、本地代理服务器系统:通过Anyproxy代理服务器将公众号历史消息页面中的文章列表发送到自己的服务器上。

4、文章列表分析与入库系统,分析文章列表和建立采集队列实现批量采集内容。

Fiddler设置代理和抓包

通过对多个账号进行抓包分析,可以确定:_biz:这个14位的字符串是每个公众号的“id”,搜狗的微信平台可以获得

uin:与访问者有关,微信号id

key:和所访问的公众号有关

步骤:

1,写按键精灵脚本,在手机上自动点击公号文章列表页,也就是“查看历史消息”;

2,使用fiddler代理劫持手机端的访问,将网址转发到本地用php写的网页;

3,在php网页上将接收到的网址备份到数据库;

4,用python从数据库取出网址,然后进行正常的爬取。

可能存在的问题:

如果只是想爬取文章内容,似乎并没有访问频率限制,但如果想抓取阅读数、点赞数,超过一定频率后,返回就会变为空值。

付费平台

例如清博 新榜,如果只是想看数据的话,直接看每天的榜单就可以了,还不用花钱,如果需要接入自己的系统的话,他们也提供api接口

3项目步骤

3.1基本原理

目标爬取网站收录了微信平台大部分的优质微信公众号文章,会定期更新,经测试发现对爬虫较为友好。

1、网站页面布局排版规律,不同公众号通过http://chuansong.me/account/almosthuman2014链接中的account区分

2、一个公众号合集下的文章翻页也有规律:id号每翻一页 12

所以流程思路就是获取预查询微信公众号ID(不是直接显示的名称,而是信息名片里的ID号,一般由数字字母组成)

请求html页面,判断是否已经收录改公众号

如果没有收录,则页面显示结果为:404该页面不存在,所以直接使用正则表达式来匹配该提示信息即可

正则匹配,找到目标公众号最大收录文章页数

解析请求页面,提取文章链接和标题文字

保存信息提取的结果

调用pdfkit和wkhtmltopdf转换网页

3.2环境win10(64bit)

Spyder(python3.6)

安装转换工具包wkhtmltopdf

requests

pdfkit

3.3公众号信息检索

通过对目标url发起requset请求,获取页面html信息,然后调用正则方法匹配两条信息

1、该公众号是否存在

2、如果存在,最大的文章收录页数是多少

url = 'http://chuansong.me/account/' str(name) '?start=' str(0)

wait = round(random.uniform(1,2),2) # 设置随机爬虫间隔,避免被封

time.sleep(wait)

html = get_one_page(url)

pattern1 = re.compile('

Page Not Found.

', re.S)

item1 = re.findall(pattern1, html)  # list类型

pattern2 = re.compile('(.\d )(\s*)(\s*?)下一页')

item2 = re.findall(pattern2, html)  # list类型

if item1:

print('\n---------该账号信息尚未收录--------\n')

exit();

else:

print('\n---------该公众号目前已收录文章页数N为:',item2[0][0])

当公众号存在时,直接调用request解析目标请求链接。#需要加一个请求头部,不然会被网站封禁

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}

try:

response = requests.get(url, headers=headers, timeout=10)

response.raise_for_status #若不为200,则引发HTTPError错误

response.encoding = response.apparent_encoding

return response.text

except:

return '产生异常'

注意,目标爬虫网站必须要加headers,否则直接拒绝访问

3.4正则解析,提取链接和文章标题

以下代码用于从html文本中解析链接和标题文字信息

def parse_one_page(html):

pattern = re.compile('

.*?.*?(.*?).*?'timestamp'.*?'>(.*?)', re.S)

items = re.findall(pattern, html)

return items

3.5自动跳转页面

以下代码通过循环递增赋值,改变url中的页码参数def main(offset, i):

url = 'http://chuansong.me/account/' str(offset) '?start=' str(12*i)

print(url)

wait = round(random.uniform(1,2),2) # 设置随机爬虫间隔,避免被封

time.sleep(wait)

html = get_one_page(url)

for item in parse_one_page(html):

info = 'http://chuansong.me' item[0] ',' item[1] ',' item[2] '\n'

info = repr(info.replace('\n', ''))

print(info)

#info.strip('\'')  #这种去不掉首尾的“

#info = info[1:-1]  #这种去不掉首尾的“

#info.Trim(''.ToCharArray())

#info.TrimStart('\'').TrimEnd('\'')

write_to_file(info, offset)

3.6去掉标题中的非法字符

因为windows下文件命令,有些字符是不能用了,所以需要使用正则剔除

itle = re.sub('[\\\\/:*?\'<>|]', '', info.loc[indexs]['标题'])

3.7转换html为PDF

使用pandas的read_csv函数读取爬取的csv文件,循环遍历“链接”,“标题”,“日期”

然后通过调用pdfkit函数转换生成PDF文件wait = round(random.uniform(1,2),2) # 设置随机爬虫间隔,避免被封

time.sleep(wait)

path = get_path(offset)

path_wk = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' #安装wkhtmltopdf的位置

config = pdfkit.configuration(wkhtmltopdf = path_wk)

if path == '' :

print('尚未抓取该公众号')

else:

info = get_url_info(offset)

for indexs in info.index:

url = info.loc[indexs]['链接']

title = re.sub('[\\\\/:*?\'<>|]', '', info.loc[indexs]['标题'])

date = info.loc[indexs]['日期']

wait = round(random.uniform(4,5),2) # 设置随机爬虫间隔,避免被封

time.sleep(wait)

print(url)

with eventlet.Timeout(4,False):

pdfkit.from_url(url, get_path(offset) '\\' date '_' title '.pdf', configuration=config)

print('转换成功!')

3.8生成的PDF结果

4结果展示

5 完整代码

由于考虑到转pdf的稳定性,我在发布版的代码中没有加转PDF的函数。预留了一个粗糙的py源文件,如果感兴趣,读者可以在此基础上自行调整修改。

https://github.com/Ctipsy/DA_projects/blob/master/%E5%BE%AE%E4%BF%A1%E6%96%87%E7%AB%A0%E6%90%9C%E9%9B%86%E5%99%A8/weixin_hacker.py

作者:SoLo

链接:https://www.jianshu.com/p/c0ca49f1368b

python信息检索和评价系统_Python爬虫实现的微信公众号文章下载器相关推荐

  1. python write非法字符报错_Python爬虫实现的微信公众号文章下载器

    平时爱逛知乎,收藏了不少别人推荐的数据分析.机器学习相关的微信公众号(这里就不列举了,以免硬广嫌疑).但是在手机微信上一页页的翻阅历史文章浏览,很不方便,电脑端微信也不方便. 所以我就想有什么方法能否 ...

  2. python 下载公众号文章_Python爬虫实现的微信公众号文章下载器

    平时爱逛知乎,收藏了不少别人推荐的数据分析.机器学习相关的微信公众号(这里就不列举了,以免硬广嫌疑).但是在手机微信上一页页的翻阅历史文章浏览,很不方便,电脑端微信也不方便. 所以我就想有什么方法能否 ...

  3. Python爬虫实现的微信公众号文章下载器

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  4. 最便捷的微信公众号文章下载器——基于Python爬虫

    总结一下自己原创的一个"亲民取巧的"获取微信公众号文章的方法.(文末附有下载链接) 1需求分析 平时爱逛知乎,收藏了不少别人推荐的数据分析.机器学习相关的微信公众号(这里就不列举了 ...

  5. python爬取论文代码_Python selenium爬取微信公众号文章代码详解

    需求: 想阅读微信公众号历史文章,但是每次找回看得地方不方便. 思路: 1.使用selenium打开微信公众号历史文章,并滚动刷新到最底部,获取到所有历史文章urls. 2.对urls进行遍历访问,并 ...

  6. python爬虫爬取微信网页_python下爬虫爬取微信公众号文章给网站的相关操作与问题...

    一.出发点 在dodo团队知乎号开刊文章中已介绍过本团队平常的实际工作,我们是一个从事游戏与金融结合的项目开发与运营团队.技术上主要是从事游戏分期.玩后付支付插件.游戏充值app等前后端开发,主要使用 ...

  7. python爬虫搜特定内容的论文_python爬取指定微信公众号文章

    python怎么抓取微信阅清晨的阳光比不上你的一缕微笑那么动人,傍晚的彩霞比不上你的一声叹息那么心疼,你的一个个举动,一句句话语都给小编带来无尽的幸福. 抓取微信公众号的文章 一.思路分析 目前所知晓 ...

  8. 如何用python爬取公众号文章搜狗微信搜索_python抓取搜狗微信公众号文章

    初学python,抓取搜狗微信公众号文章存入mysql mysql表: 代码: import requests import json import re import pymysql # 创建连接 ...

  9. python抓取微信_python抓取搜狗微信公众号文章

    初学python,抓取搜狗微信公众号文章存入mysql mysql表: 代码: import requests import json import re import pymysql # 创建连接 ...

最新文章

  1. JSON和JSONP有什么区别?
  2. RMAN异机恢复步骤及故障处理
  3. cPanel下安装GodaddySSL教程
  4. 第四章 数学知识【完结】
  5. 100内奇数之和流程图_Python进阶记录之基础篇(四)
  6. HDU 1540 Tunnel Warfare
  7. [转]论SOA架构的几种主要开发方式
  8. 前端如何正确使用中间件?
  9. 【题意+解析】1041 Be Unique (20 分)_18行代码AC
  10. 软路由ros(MIKROTIK)安装教程:[11]端口映射
  11. 2019unity游戏开发需要学什么?
  12. PN结的空间电荷区与耗尽区
  13. matlab半小提琴图,matplotlib – 分开的小提琴图的一半,以比较尾部数据
  14. PS之5分钟学会使用快速选择工具抠图
  15. 携手Nutanix,AMD EPYC服务器打造全新超融合生态
  16. cad墙线打断lisp_CAD绘制墙体时,不打断模式有什么好处?
  17. 代理模式——游戏代练
  18. 实验室常用培养基配置 LB LA
  19. Python程序设计基础第七章笔记:字符串
  20. Bode Plots by Hand 徒手绘制波特图

热门文章

  1. 个人总结对团队的贡献Android方面
  2. Sperax月报 | 2021年8月
  3. 世界互联网大会展示前沿技术热议创新方向
  4. (精品原创)Java代码优化-代码复用与重构
  5. 【历史上的今天】3 月 28 日:EPROM 的发明者出生;计算机进入艾滋病研究领域
  6. 信号量与生产者消费者问题
  7. spring cloud oauth2系列篇(二)深入authorization_code授权码模式完整实现
  8. 【产品笔记】1.什么是精益产品探索
  9. 手把手教你用vue+JavaScript+openlayers+iview制作实时天气预报图
  10. PowerBI把日期戳格式转换成常见日期格式