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的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
python实现获取客户机上指定文件并传输到服务器的方法
Mar 16 Python
Python查找函数f(x)=0根的解决方法
May 07 Python
python回调函数用法实例分析
May 09 Python
Django中Model的使用方法教程
Mar 07 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
Python面向对象基础入门之设置对象属性
Dec 11 Python
python异步存储数据详解
Mar 19 Python
python集成开发环境配置(pycharm)
Feb 14 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
使用Python画了一棵圣诞树的实例代码
Nov 27 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实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
图片格式的JavaScript和CSS速查手册
2007/08/20 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
详解js类型判断
2018/05/22 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
Python备份Mysql脚本
2008/08/11 Python
python实现定时播放mp3
2015/03/29 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
优秀求职信范文分享
2013/12/19 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
汉语言文学职业规划
2014/02/14 职场文书
财务担保书范文
2014/04/02 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
html5调用摄像头实例代码
2021/06/28 HTML / CSS