如何获取微信公众号文章的方法?附有下载链接总结

优采云 发布时间: 2021-08-14 18:37

  如何获取微信公众号文章的方法?附有下载链接总结

  文末附有下载链接

  总结一下我原创的“亲民”获取微信公众号文章的方法之一。

  1 需求分析

  平时逛街知乎,采集了很多其他人推荐的数据分析和机器学习相关的微信公众号(这里不一一列举,以免怀疑硬播)。但是手机微信上一页浏览历史文章不方便,电脑微信不方便。

  所以不知道有没有办法下载这些公众号文章。在这种情况下,似乎很方便。但是网上的方法要么太复杂(对我来说爬虫新手)要么收费。

  但是我的需求其实很简单——“方便查找/检索/浏览任何相关公众号的文章”,所以经过一番学习和检索,我开始做一个小工具(打包成可执行文件) ,虽然方法和代码比较简单,但是手工使用其实还是蛮方便的。也给了他的搭档安利几波。

  工具要求:

  2 现有计划

  我也在网上搜索了一些关于爬取微信公众号的资料,大概有以下几种

  Selenium 爬取过程 AnyProxy 代理批处理采集Fiddler 设置代理和抓包

  通过捕获和分析多个帐户,我们可以确定:

  可能的问题:

  如果你只是想抓取文章内容,好像没有访问频率限制,但是如果你想抓取阅读数和点赞数,达到一定的频率后,返回就会变成null价值。

  付费平台

  比如你只是想看清博的新榜,直接看每日榜就可以了,不需要花钱。如果需要连接自己的系统,他们也提供了api接口

  3个项目步骤3.1基本原则

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

  1、网站页面布局和排版规则,不同公众号通过链接中的账号区分

  2、一公号集集文章翻页也是正常的:id号+12翻页

  

  门户.png

  所以流程思路是

  3.2环境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 定期分析,提取链接和文章title

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

  def parse_one_page(html):

pattern = re.compile('.*?.*?<a class="question_link" href="(.*?)".*?_blank"(.*?)/a.*?"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下的file命令,有些字符不能用,所以需要使用正则消除

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

  3.7 将 html 转换为 PDF

  使用pandas的read_csv函数读取爬取的csv文件,循环遍历“link”、“title”、“date”

  然后调用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.png

  4 条结果显示4.1 抓取结果

  

  结果1.png

  抓取的几个公众号存放在文件夹中

  

  ![Result3.png](%7CimageView2/2/w/1240)

  文件夹目录下的内容

  已抓取 CSV 内容格式

  4.2 工具运行示例

  

  1.png

  查看微信公众号

  

  2.png

  输入公众号和下载页面数

  

  3.png

  下载内容

  5 完整代码

  由于转PDF的稳定性,我没有在release版的代码中添加转PDF的功能。保留了一个粗略的py源文件。有兴趣的读者可以自行调整修改。

  点击获取代码

  6个exe文件下载链接

  点击此处获取工具下载链接

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线