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 相关文章推荐
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
Python对象中__del__方法起作用的条件详解
Nov 01 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
Python实现实时数据采集新型冠状病毒数据实例
Feb 04 Python
python离线安装外部依赖包的实现
Feb 13 Python
python读取csv文件指定行的2种方法详解
Feb 13 Python
如何理解python中数字列表
May 29 Python
详解numpy1.19.4与python3.9版本冲突解决
Dec 15 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 Python
python中validators库的使用方法详解
Sep 23 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
PHP数据库操作面向对象的优点
2006/10/09 PHP
php创建类并调用的实例方法
2019/09/25 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
matplotlib中legend位置调整解析
2017/12/19 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
django settings.py 配置文件及介绍
2019/07/15 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
python基于property()函数定义属性
2020/01/22 Python
Pycharm调试程序技巧小结
2020/08/08 Python
师范毕业生求职自荐信
2013/09/25 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
联欢晚会主持词
2014/03/25 职场文书
《春笋》教学反思
2014/04/15 职场文书
三八妇女节标语
2014/10/09 职场文书
县委务虚会发言材料
2014/10/20 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
信访维稳承诺书
2015/05/04 职场文书
公司年会开场白
2015/06/01 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
MySQL 开窗函数
2022/02/15 MySQL