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

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

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

工具需求:

输入:给定公众号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结果展示

?

?

?

原文:https://www.cnblogs.com/paisenpython/p/10271924.html

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

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

    所以我就想有什么方法能否将这些公众号文章下载下来.这样的话,看起来也方便.但是网上的方法要么太复杂(对于我这个爬虫入门新手来说),要么付费. 但我的需求其实却很简单--"方便的查找 / 检索 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. python爬虫抓取微信公众号文章(含全文图以及点赞数、在看数、阅读数)

    因工作需要写了一个微信公众号文章的爬虫程序,贴一下分享给需要的朋友. 首先是抓取文章的url链接,在反复研究之后找到的一个最简单的方法,不需要抓包工具.首先需要自己注册一个微信公众号,有微信即可绑定注 ...

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

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

最新文章

  1. 【鸿蒙 HarmonyOS】UI 组件 ( 拖动条 Slider 组件 )
  2. 三方会谈进行时,Uber旧金山无人车已被叫停
  3. 微信客服系统开发SDK使用教程- 拉取当前微信个人号列表请求(立即)
  4. 国外创意网站设计欣赏的200佳网站推荐(系列十)
  5. C++ Primer 5th笔记(chap 17 标准库特殊设施)正则表达式
  6. oracle exp导出成功终止,成功终止导出
  7. boost::log::attribute_value_set用法的测试程序
  8. YbOJ-网格序列【拉格朗日插值】
  9. 前端学习(1058):面向对象介绍
  10. Maven 系列 3:如何在 Eclipse 中集成配置 Maven(以 apache-maven-3.6.2、eclipse-jee-2019-09-R-win32-x86_64 为例)
  11. 再写dll 关于declspec(dllexport)和declspec(dllimport)
  12. Flutter ValueNotifier 异步通信、ValueListenableBuilder异步更新数据
  13. 在iPhone程序上读取PDF文件
  14. struts2 国际化资源文件自定义的路径解决方法
  15. Android编程之另一种原因造成Cursor未关闭错误
  16. APK 包名修改工具
  17. 如何下载微信公众号里面的视频?
  18. DirectSound学习(二)--流式缓冲区
  19. 原生app签名如何转换成快应用签名
  20. 中国移动 云MAS平台HTTP2.1(HTTP版)发送普通短信

热门文章

  1. 【集合框架】JDK1.8源码分析之IdentityHashMap(四)
  2. 面对 iPad,Surface 的键盘是必杀技
  3. 6425C-Lab2 安全高效地管理AD
  4. python3 文件内容搜索 文件名搜索 目录遍历
  5. golang goland报错错误 $GOPATH/go.mod exists but should not 解决方法
  6. php 执行系统命令函数
  7. linux bash 写入文件
  8. linux redis 启动警告解决方法
  9. python3 编译优化 --enable-shared --enable-optimizations
  10. metasploit 使用实例