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

2020-10-09 0 908

参照资料:selenium webdriver添加cookie: https://www.jb51.net/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://www.jb51.net/article/193107.htm

遇到的坑:

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。

遇见资源网 Python Python selenium爬取微信公众号文章代码详解 http://www.ox520.com/26795.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务