专栏首页源懒由码python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。

python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。

参照资料:selenium webdriver 如何添加cookie: https://www.cnblogs.com/sundahua/p/10202494.html

需求:

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

思路:

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

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

实现

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

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,可以发现,文章到最底部的判断是。

<span class="tips js_no_more_msg" style="display: none;">中的style属性改变,“style="transform-origin: 0px 0px; opacity: 1; transform: scale(1, 1);"
<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 class="weui_msg_card js_card" 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==&amp;mid=2247483748&amp;idx=1&amp;sn=e804e638484794181a27c094f81be8e1&amp;chksm=ec1e6d2ddb69e43bd3e1f554c2d0cedb37f099252f122cee1ac5052b589b56f428b2c304de8e&amp;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==&amp;mid=2247483748&amp;idx=1&amp;sn=e804e638484794181a27c094f81be8e1&amp;chksm=ec1e6d2ddb69e43bd3e1f554c2d0cedb37f099252f122cee1ac5052b589b56f428b2c304de8e&amp;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==&amp;mid=2247483748&amp;idx=1&amp;sn=e804e638484794181a27c094f81be8e1&amp;chksm=ec1e6d2ddb69e43bd3e1f554c2d0cedb37f099252f122cee1ac5052b589b56f428b2c304de8e&amp;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')

最终保存形式

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

记一次 excel vba 参考手册爬虫实战,不必要的一次爬虫。:https://www.cnblogs.com/cycxtz/p/13303306.html

遇到的坑:

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python 舆情分析 nlp主题分析 (1) 待续

    参考资料: https://blog.csdn.net/Eastmount/article/details/50891162 # 该博主有很多篇幅,解释算法原...

    forxtz
  • python + selenium 爬虫模拟登录破解无原图滑动验证码

    爬虫模拟登录破解无原图滑动验证码: https://www.cnblogs.com/98WDJ/p/11050559.html

    forxtz
  • vbs - 一个简单的栈 -- 只能存储类对象

    forxtz
  • 《Vue3.0抢先学》系列之:一个简单的例子

    书接上文:你被我撩拨了一下,从Github上下载了Vue3.0的源码。然后呢,你是不是已经迫不及待的想知道到底怎么样快速的把这个源代码用起来呢?

    一斤代码
  • Datepicker日期选择器插件

    这个插件还是比较简单的,而且样式也比较漂亮,可以自定义选择年月日、年月日时分、年月、时间段选择等等。

    从入门到进错门
  • Bootstrap响应式前端框架笔记十四——媒体对象与列表组

        在移动开发中经常会使用到列表,使用媒体对象可以方便的创建列表中每一行元素,常规的媒体对象实例如下:

    珲少
  • img标签随机获取高质量图片

    zhaoolee
  • .net core 实现简单爬虫—抓取博客园的博文列表

    晓晨
  • bootstrap 后台管理系统工作界面布局方式

    <aside class="sidebar-250canvas-right bg-default "> 左</aside>

    爱明依
  • 框架的 总结(nop)------添加功能

    wfaceboss

扫码关注云+社区

领取腾讯云代金券