Python selenium爬取微信公众号文章代码详解
参照资料:selenium webdriver添加cookie: https://www.jb51.net/article/193102.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,可以发现,文章到最底部的判断是。
<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')
最终保存形式
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-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
- 这篇文章主要为大家详细介绍了C#微信开发之发送模板消息的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
Python getsizeof()和getsize()区分详解
这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20- 这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
- 这篇文章主要介绍了解决python 两个时间戳相减出现结果错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-12