Python selenium爬取微信公众号文章代码详解


Posted in Python onAugust 12, 2020

参照资料:selenium webdriver添加cookie: https://3water.com/article/193102.html

需求:

想阅读微信公众号历史文章,但是每次找回看得地方不方便。

思路:

1、使用selenium打开微信公众号历史文章,并滚动刷新到最底部,获取到所有历史文章urls。

2、对urls进行遍历访问,并进行下载到本地。

实现

1、打开微信客户端,点击某个微信公众号->进入公众号->打开历史文章链接(使用浏览器打开),并通过开发者工具获取到cookies,保存为excel。

Python selenium爬取微信公众号文章代码详解

2、启动webdriver,并添加相应cookies。

browser = webdriver.Chrome()
wait = WebDriverWait(browser,10)
# 随便访问一个地址,然后才能设置cookies
browser.get('https://httpbin.org/get')
# 添加cookies,df为保存的excel cookies
for i in range(len(df)):
  cookie_dict = {
          "domain": df.loc[i,'DomaiN'], 
          'name': df.loc[i,'Name'],
          'value': str(df.loc[i,'Value']),
          "expires": df.loc[i,"Expires/Max-Age"],
          'path': '/',}
  browser.add_cookie(cookie_dict)
browser.get(weixin_url)

3、控制浏览器下移动

观察page_source,可以发现,文章到最底部的判断是。

<div class="loadmore with_line" style="display: none;" id="js_nomore">
    <div class="tips_wrp">
      <span class="tips js_no_more_msg" style="display: none;">已无更多</span>
      <span class="tips js_need_add_contact" style="display: none;">关注公众帐号,接收更多消息</span>
    </div>
  </div>

使用driver控制JS。

%%time
# 通过判断已无更多的style,来判断是否到最底部,最终执行到最底部
no_more_msg_style = 'display: none;'
while True:
  wait.until(EC.presence_of_element_located((By.XPATH,'//span[@class="tips js_no_more_msg" and text()="已无更多"]')))
  no_more= browser.find_element_by_xpath('//span[@class="tips js_no_more_msg" and text()="已无更多"]')
  now_style = no_more.get_attribute('style')
  if str(now_style).find(no_more_msg_style) == -1:
    # 说明已经加载完了
    break
  else:
    # 停顿一会,等待浏览器加载
    time.sleep(5)
    # 通过JS,执行到最底部
    browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')

4、关键信息获取。

根据html,分析得出文章url处在<div msgid="1000000026">中。

<div class="weui_msg_card js_card" msgid="1000000026">
      <div class="weui_msg_card_hd">2017年1月13日</div>
      <div class="weui_msg_card_bd">
         <!-- 图文 -->
             <!-- 普通图文 -->
            <div id="WXAPPMSG1000000026" class="weui_media_box appmsg js_appmsg" hrefs="http://mp.weixin.qq.com/s?__biz=MzI5MDQ4NzU5MA==&mid=2247483748&idx=1&sn=e804e638484794181a27c094f81be8e1&chksm=ec1e6d2ddb69e43bd3e1f554c2d0cedb37f099252f122cee1ac5052b589b56f428b2c304de8e&scene=38#wechat_redirect" data-t="0">
              <span class="weui_media_hd js_media" style="background-image:url(http://mmbiz.qpic.cn/mmbiz_jpg/XibhQ5tjv6dG9B4GF1C9MGBJO5AR2wvjCL9LgdcFgAdEgyU8wZFuDXoH9O9dNvafwK3RibCjUyiarIlUDlkxbcyfQ/640?wx_fmt=jpeg)" data-s="640" hrefs="http://mp.weixin.qq.com/s?__biz=MzI5MDQ4NzU5MA==&mid=2247483748&idx=1&sn=e804e638484794181a27c094f81be8e1&chksm=ec1e6d2ddb69e43bd3e1f554c2d0cedb37f099252f122cee1ac5052b589b56f428b2c304de8e&scene=38#wechat_redirect" data-type="APPMSG">
              </span>
              <div class="weui_media_bd js_media" data-type="APPMSG">
                <h4 class="weui_media_title" hrefs="http://mp.weixin.qq.com/s?__biz=MzI5MDQ4NzU5MA==&mid=2247483748&idx=1&sn=e804e638484794181a27c094f81be8e1&chksm=ec1e6d2ddb69e43bd3e1f554c2d0cedb37f099252f122cee1ac5052b589b56f428b2c304de8e&scene=38#wechat_redirect">
                  承认自己是难民有什么错
                </h4>
                <p class="weui_media_desc">枷锁已经足够沉重,谢绝道德绑架</p>
                <p class="weui_media_extra_info">2017年1月13日</p>
              </div>
            </div> 
      </div>
    </div>

文章类型主要分为,

<div class="weui_media_bd js_media" data-type="APPMSG">
<div class="weui_media_bd js_media" data-type="TEXT">

有无原创进行划分。

最终实现:

%%time
result = []
errlist = []
# 先得到其中一个
el_divs = browser.find_elements_by_xpath('//div[@class="weui_msg_card_list"]/div[@class="weui_msg_card js_card"]')
i = 0
for div in el_divs:
  date = title = url = yuanchuang = ''
  try:
    date = div.find_element_by_xpath('.//div[@class="weui_msg_card_hd"]').get_attribute('innerHTML')
    el_content = div.find_element_by_xpath('.//div[@class="weui_media_bd js_media"]')
    if el_content.get_attribute('data-type') == 'APPMSG':
      el = el_content.find_element_by_xpath('./h4[@class="weui_media_title"]')
      title = el.text
      url = el.get_attribute('hrefs')
      xb = el_content.find_element_by_xpath('./p[@class="weui_media_extra_info"]').text
      yuanchuang = '原创' if xb.find('原创') != -1 else ''
    elif el_content.get_attribute('data-type') == 'TEXT':
      title = '随文'
      url = el_content.find_element_by_xpath('./div').text
      yuanchuang = '原创'
    else:
      # 其他未能识别的类型
      errlist.append([i,div.get_attribute('innerHTML')])
  except NoSuchElementException:
    errlist.append([i,div.get_attribute('innerHTML')])
  print(str(i),':',date,title,url,yuanchuang)
  result.append([date,title,yuanchuang,url])
  i = i + 1

5、将得到url保存到excel

dfout = pd.DataFrame(result, columns=['日期', '标题', '原创', '地址'])
with pd.ExcelWriter(savename) as writer:
dfout.to_excel(writer,index=False,sheet_name = 'Sheet1')

最终保存形式

Python selenium爬取微信公众号文章代码详解

6、在遍历最后的链接地址,逐个requets保存,即可得到。组建成菜单形式的文章,可参考

记一次 excel vba 参考手册爬虫实战,不必要的一次爬虫。:htthttps://3water.com/article/193107.htm

遇到的坑:

1、find_element_by_xpath 需要配上 NoSuchElementException 使用,否则遇到未找到的节点就会出错,最初find_elements_by_xpath 来防止找不到相关节点,结果发现,执行速度异常的慢,需要查找原因。

2、cookies使用的时候是人为获取,如果太长时间不用,需要重新获取。可以考虑结合pyautogui来控制weixin客户端来进行获取。?

3、构建的时候,最后分布试行,最初的文章类型没有做好判断,结果执行时间很久。做好异常捕获,再逐步分析错误的节点问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
Python原始字符串(raw strings)用法实例
Oct 13 Python
Python基于smtplib实现异步发送邮件服务
May 28 Python
Python3中简单的文件操作及两个简单小实例分享
Jun 18 Python
Python3 模块、包调用&amp;路径详解
Oct 25 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
tensorflow实现KNN识别MNIST
Mar 12 Python
python如何把字符串类型list转换成list
Feb 18 Python
一文轻松掌握python语言命名规范规则
Jun 18 Python
使用Python提取文本中含有特定字符串的方法示例
Dec 09 Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 Python
写一个Python脚本自动爬取Bilibili小视频
Apr 24 Python
PyQt5 QDockWidget控件应用详解
Aug 12 #Python
pyqt5 textEdit、lineEdit操作的示例代码
Aug 12 #Python
基于python requests selenium爬取excel vba过程解析
Aug 12 #Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 #Python
Python自动发送和收取邮件的方法
Aug 12 #Python
Selenium webdriver添加cookie实现过程详解
Aug 12 #Python
Python如何设置指定窗口为前台活动窗口
Aug 12 #Python
You might like
简单采集了yahoo的一些数据
2007/02/14 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
jquery CSS选择器笔记
2010/03/29 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
jquery插件之easing 动态菜单
2010/08/21 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
JS实现的论坛Ajax打分效果完整实例
2015/10/31 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
2019/11/05 Javascript
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
python实现网站的模拟登录
2016/01/04 Python
PyQt5每天必学之滑块控件QSlider
2018/04/20 Python
python3+PyQt5使用数据库表视图
2018/04/24 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
德国童装购物网站:NICKI´S.com
2018/04/20 全球购物
部队万能检讨书
2014/02/20 职场文书
学习标兵获奖感言
2014/02/20 职场文书
《圆明园的毁灭》教学反思
2014/02/28 职场文书
班委竞选演讲稿
2014/04/28 职场文书
廉政承诺书
2015/01/19 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸
golang使用map实现去除重复数组
2022/04/14 Golang