参照资料:selenium webdriver添加cookie: http://www.zzvips.com/article/93515.html
需求:
想阅读微信公众号历史文章,但是每次找回看得地方不方便。
思路:
1、使用selenium打开微信公众号历史文章,并滚动刷新到最底部,获取到所有历史文章urls。
2、对urls进行遍历访问,并进行下载到本地。
实现
1、打开微信客户端,点击某个微信公众号->进入公众号->打开历史文章链接(使用浏览器打开),并通过开发者工具获取到cookies,保存为excel。
2、启动webdriver,并添加相应cookies。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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,可以发现,文章到最底部的判断是。
1
2
3
4
5
6
|
< 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。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
%%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">中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
< 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">
有无原创进行划分。
最终实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
% % 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 参考手册爬虫实战,不必要的一次爬虫。:http://www.zzvips.com/article/93514.html
遇到的坑:
1、find_element_by_xpath 需要配上 NoSuchElementException 使用,否则遇到未找到的节点就会出错,最初find_elements_by_xpath 来防止找不到相关节点,结果发现,执行速度异常的慢,需要查找原因。
2、cookies使用的时候是人为获取,如果太长时间不用,需要重新获取。可以考虑结合pyautogui来控制weixin客户端来进行获取。?
3、构建的时候,最后分布试行,最初的文章类型没有做好判断,结果执行时间很久。做好异常捕获,再逐步分析错误的节点问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/cycxtz/p/13416245.html