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 相关文章推荐
简单介绍Python2.x版本中的cmp()方法的使用
May 20 Python
Python基于DES算法加密解密实例
Jun 03 Python
Python统计日志中每个IP出现次数的方法
Jul 06 Python
Python协程的用法和例子详解
Sep 09 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
python实现停车管理系统
Nov 30 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
Oct 30 Python
Django实现简单网页弹出警告代码
Nov 15 Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
python计算列表元素与乘积详情
Aug 05 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
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
浅析PHP Socket技术
2013/08/02 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
javascript中普通函数的使用介绍
2013/12/19 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
Vue $attrs &amp; inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
Python连接Redis的基本配置方法
2018/09/13 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
python支持多线程的爬虫实例
2019/12/21 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
卫校中专生个人自我评价
2013/09/19 职场文书
汽车销售顾问求职自荐信
2014/01/01 职场文书
我的中国梦演讲稿小学篇
2014/08/19 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
工会工作个人总结
2015/03/03 职场文书
营运督导岗位职责
2015/04/10 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技