python爬取微信公众号文章(包含文章内容和图片)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_41267342/article/details/96729138

之前虽然做过网页爬取,但微信爬取一直没做过,因为我一直不知道网页可以进微信公众平台,只用过微信客户端进微信公众号。既然可以通过网页进微信公众平台,那么爬取微信公众号文章就流程上就没太多难度了。

自己在网上找的一些python爬虫文章不太好用,就亲自写了一套,包括详细的页面附图和代码注释,代码复制下来后可以直接运行,供需要的同行参考交流。  爬取微信公众号文章之前,需要先申请微信公众号,针对个人使用的订阅号就行。

    爬取微信公众号文章有两种思路:

   一种是通过搜狗浏览器爬取,因为微信公众平台为搜狗提供了访问接口。

  第二种种就是通过google或firefox浏览器来爬取,本篇文章只讲解第二种方式,但第一种方式也可以借鉴第二种方式的部分代码。

    1、通过调用谷歌或火狐浏览器驱动,模拟微信公众号登录,获取到cookies(里面包含登录身份的token值),将cookies保存到本地文件中,供以后面访问微信公众号时携带身份识别之用。

    页面如下:

 点击登录后跳出来扫描验证页面:

 

login.py文件代码如下:


 
 
  1. # -!- coding: utf-8 -!-
  2. from selenium import webdriver
  3. import time
  4. import json
  5. #谷歌和火狐两种驱动人选一种即可
  6. # 调用谷歌浏览器驱动 如果本地电脑未安装谷歌驱动,请网上下载
  7. driver = webdriver.Chrome()
  8. # 调用火狐浏览器驱动 如果本地电脑未安装火狐驱动,请网上下载
  9. # driver = webdriver.Firefox()
  10. driver.get("https://mp.weixin.qq.com/") # 微信公众平台网址
  11. driver.find_element_by_name("account").clear()
  12. driver.find_element_by_name("account").send_keys("1466617803@qq.com") # 自己的微信公众号
  13. time.sleep(2)
  14. driver.find_element_by_name("password").clear()
  15. driver.find_element_by_name("password").send_keys("*******") # 自己的微信公众号密码
  16. driver.find_element_by_class_name("icon_checkbox").click()
  17. time.sleep(2)
  18. driver.find_element_by_class_name("btn_login").click()
  19. time.sleep(15)
  20. #此时会弹出扫码页面,需要微信扫码
  21. cookies = driver.get_cookies() # 获取登录后的cookies
  22. print(cookies)
  23. cookie = {}
  24. for items in cookies:
  25. cookie[items.get("name")] = items.get("value")
  26. # 将cookies写入到本地文件,供以后程序访问公众号时携带作为身份识别用
  27. with open('cookies.txt', "w") as file:
  28. # 写入转成字符串的字典
  29. file.write(json.dumps(cookie))

    2、扫码后进入公众号首页,点击左侧的素材管理,如下图:

3、点击完素材管理后进入如下界面,并点击新建图文素材:

4、点击完新建图文素材后,等待5~6秒,进入如下页面:

5、点击上图中紫色框处的链条标志,进入如下页面,选择查找文章,在公众号中输入要查询的公众号,并点击输入框右侧的放大镜查询标识,例如输入“共轨之家”(别想歪了哈,只是个介绍汽车维修资料的公众号哈):

6、选中搜索出来的符合要求的公众号(当然也可以用微信公众号的唯一id搜,例如:gongguizhijia),单击后进入公众号,可以看到该公众号下的文章,如下图:

7、此时要上代码了,先分析一下文章的分页和F12后可以看到的请求信息。

    (1)、我们看到总共53页,每页展示20条。

    (2)、F12查看请求方式,请求头如下图:

    (3)不断的点击不同页码,发现查询参数begin的值和页码的关系为:begin=(当前页-1)*5,count值始终为5,token值可以从浏览器中获取。

   8、爬取该公众号下的所有文章的名字、唯一表示、链接,保存到本地文件article_link中,供爬取文章页面用(此处微信有访问频率限制,具体多少没详细测,我连续访问32次后被限制访问,提醒我操作频繁)。

         get_article_link.py代码如下:


 
 
  1. # -*- coding:utf-8 -*-
  2. import requests
  3. import json
  4. import re
  5. import random
  6. import time
  7. with open("cookies.txt", "r") as file:
  8. cookie = file.read()
  9. cookies = json.loads(cookie)
  10. url = "https://mp.weixin.qq.com"
  11. response = requests.get(url, cookies=cookies)
  12. token = re.findall(r'token=(\d+)', str(response.url))[0] # 从url中获取token
  13. print(token)
  14. headers = {
  15. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
  16. "Referer": "https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&token="+token+"&lang=zh_CN",
  17. "Host": "mp.weixin.qq.com",
  18. }
  19. # requestUrl = "https://mp.weixin.qq.com/cgi-bin/searchbiz"
  20. with open('article_link.txt', "w", encoding='utf-8') as file:
  21. for j in range(1, 53, 1):
  22. begin = (j-1)*5
  23. requestUrl = "https://mp.weixin.qq.com/cgi-bin/appmsg?token="+token+"&lang=zh_CN&f=json&ajax=1&random="+str(random.random())\
  24. +"&action=list_ex&begin="+str(begin)+"&count=5&query=&fakeid=MzA3NDM2ODIzMQ%3D%3D&type=9"
  25. search_response = requests.get(requestUrl, cookies=cookies, headers=headers)
  26. re_text = search_response.json()
  27. print(re_text)
  28. list = re_text.get("app_msg_list")
  29. for i in list:
  30. file.write(i["aid"]+" <=====>"+i["title"]+" <=====>"+i["link"] + "\n")
  31. print(i["aid"]+" <=====>"+i["title"]+" <=====>"+i["link"])
  32. time.sleep(20)

9、获取到的链接保存格式为:

10、解析上一步获取到的文章链接,

download_article.py代码如下:


 
 
  1. # -*- coding:utf-8 -*-
  2. import json
  3. import re
  4. import time
  5. from bs4 import BeautifulSoup
  6. import requests
  7. import os
  8. # 保存页面到本地
  9. def save_html(url_content,htmlDir,file_name):
  10. f = open(htmlDir+"\\"+file_name+'.html', 'wb')
  11. f.write(url_content.content) # save to page.html
  12. f.close()
  13. return url_content
  14. # 修改文件,将图片路径改为本地的路径
  15. def update_file(old, new,htmlDir):
  16. with open(htmlDir+"\\"+file_name+'.html', encoding='utf-8') as f, open(htmlDir+"\\"+file_name+'_bak.html', 'w',
  17. encoding='utf-8') as fw: # 打开两个文件,原始文件用来读,另一个文件将修改的内容写入
  18. for line in f: # 遍历每行,取出来的是字符串,因此可以用replace 方法替换
  19. new_line = line.replace(old, new) # 逐行替换
  20. new_line = new_line.replace("data-src", "src")
  21. fw.write(new_line) # 写入新文件
  22. os.remove(htmlDir+"\\"+file_name+'.html') # 删除原始文件
  23. time.sleep(10)
  24. os.rename(htmlDir+"\\"+file_name+'_bak.html', htmlDir+"\\"+file_name+'.html') # 修改新文件名, old -> new
  25. print('当前保存文件为:'+file_name+'.html')
  26. # 保存图片到本地
  27. def save_file_to_local(htmlDir,targetDir,search_response,domain):
  28. obj = BeautifulSoup(save_html(search_response,htmlDir,file_name).content, 'lxml') # 后面是指定使用lxml解析,lxml解析速度比较快,容错高。
  29. imgs = obj.find_all('img')
  30. # 将页面上图片的链接加入list
  31. urls = []
  32. for img in imgs:
  33. if 'data-src' in str(img):
  34. urls.append(img['data-src'])
  35. elif 'src=""' in str(img):
  36. pass
  37. elif "src" not in str(img):
  38. pass
  39. else:
  40. urls.append(img['src'])
  41. # 遍历所有图片链接,将图片保存到本地指定文件夹,图片名字用0,1,2...
  42. i = 0
  43. for each_url in urls: # 看下文章的图片有哪些格式,一一处理
  44. if each_url.startswith('//'):
  45. new_url = 'https:' + each_url
  46. r_pic = requests.get(new_url)
  47. elif each_url.startswith('/') and each_url.endswith('gif'):
  48. new_url = domain + each_url
  49. r_pic = requests.get(new_url)
  50. elif each_url.endswith('png') or each_url.endswith('jpg') or each_url.endswith('gif') or each_url.endswith('jpeg'):
  51. r_pic = requests.get(each_url)
  52. t = os.path.join(targetDir, str(i) + '.jpeg') # 指定目录
  53. print('当前保存图片为:' + t)
  54. fw = open(t, 'wb') # 指定绝对路径
  55. fw.write(r_pic.content) # 保存图片到本地指定目录
  56. i += 1
  57. update_file(each_url, t, htmlDir) # 将老的链接(有可能是相对链接)修改为本地的链接,这样本地打开整个html就能访问图片
  58. fw.close()
  59. #下载html页面和图片
  60. def save(search_response,file_name):
  61. htmlDir = os.path.join(os.path.dirname(os.path.abspath(__file__)), file_name)
  62. targetDir = os.path.join(os.path.dirname(os.path.abspath(__file__)),file_name+'\imgs1') # 图片保存的路径,eg,向前文件夹为'D:\Coding', 即图片保存在'D:\Coding\imgs1\'
  63. if not os.path.isdir(targetDir): # 不存在创建路径
  64. os.makedirs(targetDir)
  65. domain = 'https://mp.weixin.qq.com/s'
  66. save_html(search_response, htmlDir,file_name)
  67. save_file_to_local(htmlDir, targetDir, search_response, domain)
  68. # 获得登录所需cookies
  69. with open("cookies.txt", "r") as file:
  70. cookie = file.read()
  71. cookies = json.loads(cookie)
  72. url = "https://mp.weixin.qq.com"
  73. response = requests.get(url, cookies=cookies)
  74. token = re.findall(r'token=(\d+)', str(response.url))[0]
  75. print(token)
  76. headers = {
  77. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
  78. "Referer": "https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&token="+token+"&lang=zh_CN",
  79. "Host": "mp.weixin.qq.com",
  80. }
  81. f = open("article_link.txt", encoding='utf-8') # 返回一个文件对象
  82. line = f.readline() # 调用文件的 readline()方法
  83. for line in open("article_link.txt", encoding='UTF-8'):
  84. new_line = line.strip()
  85. line_list = new_line.split(" <=====>")
  86. file_name = line_list[0]
  87. dir_name = line_list[1]
  88. requestUrl = line_list[2]
  89. search_response = requests.get(requestUrl, cookies=cookies, headers=headers)
  90. save(search_response, file_name)
  91. print(file_name+"----------------下载完毕:"+dir_name+"----------------下载完毕:"+requestUrl)
  92. time.sleep(2)
  93. file.close()

11、下载后文章效果:

 

12、选择了google、百度、火狐、ie、Edge五种浏览器测试效果,其中google、百度、Edge浏览器正常打开带图片的页面,firefox浏览器只有文字,没有图片,ie打不开页面。综上,该爬取效果基本能满足需要。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值