搜索
Hi~登录注册
查看: 1165|回复: 0

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

[复制链接]

0

主题

0

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2020-8-19 05:57:47 来自手机 | 显示全部楼层 |阅读模式
参照资料:selenium webdriver添加cookie: https://www.jb51.net/article/193102.html
需求:
想阅读微信公众号历史文章,但是每次找回看得地方不方便。
思路:
1、使用selenium打开微信公众号历史文章,并滚动刷新到最底部,获取到所有历史文章urls。
2、对urls进行遍历访问,并进行下载到本地。
实现
1、打开微信客户端,点击某个微信公众号->进入公众号->打开历史文章链接(使用浏览器打开),并通过开辟者工具获取到cookies,生存为excel。

2、启动webdriver,并添加相应cookies。
  1. browser = webdriver.Chrome()wait = WebDriverWait(browser,10)# 随便访问一个地址,然后才能设置cookiesbrowser.get('https://httpbin.org/get')# 添加cookies,df为生存的excel cookiesfor 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.   
复制代码
使用driver控制JS。
  1. %%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.       2017年1月13日
  2.                                                                                                   [size=3]                  承认本身是难民有什么错                [/size]
  3.                 枷锁已经足够沉重,谢绝道德绑架
  4.                 2017年1月13日
  5.               
  6.             
  7.       
  8.    
复制代码
文章范例主要分为,
<div class="weui_media_bd js_media" data-type="APPMSG">
<div class="weui_media_bd js_media" data-type="TEXT">
有无原创进行划分。
最终实现:
  1. %%timeresult = []errlist = []# 先得到其中一个el_divs = browser.find_elements_by_xpath('//div[@class="weui_msg_card_list"]/div[@class="weui_msg_card js_card"]')i = 0for 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、构建的时候,最后分布试行,最初的文章范例没有做好判定,结果执行时间好久。做好异常捕获,再渐渐分析错误的节点问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 点我注册

快速回复 返回顶部 返回列表