搜狗微信公衆號文章抓取

機器能作的事就別讓人來作!html

目標: 抓取特定微信公衆號文章瀏覽器

思路:利用selenium模擬瀏覽器行爲,進行抓取(理由:搜狗已將文章連接進行處理,且頁面爲動態生成)微信

框架:框架

  

步驟:ide

一、登陸搜狗url

  a、找到登陸按鈕並點擊spa

  self.browser.find_element_by_id("loginbtn").click()
  此時產生一個登陸的iframe,其中還嵌套一個iframe,都是動態生成的,內嵌於該頁面的另外一個新的html頁面,咱們須要
定位到第二個iframe才能進行真正的登陸操做

  b、定位到登陸界面的實際iframe
  self.browser.switch_to.frame(0)
  time.sleep(10)
  self.browser.switch_to.frame("ptlogin_iframe") // ptlogin_iframe爲實際登陸界面的iframe

  c、 實現qq快捷登陸
  利用qq實現快速登陸,前提是你已登陸本身的qq帳號,而後在頁面直接點擊你的qq頭像便可實現登陸操做。固然,你也能夠經過帳號/密碼實現登陸。
  self.browser.find_element_by_id("qlogin_list").find_element_by_xpath("a").click()  // 找到你的qq頭像對應的元素位置並點擊

二、抓取文章

  搜狗頁面呈現方式:
























抓取數據格式:
  標題, 概要信息, 發佈時間, 圖片url, 文章實際url
經過審查元素,咱們看一下每一個文章在頁面源碼中的表現形式,以下圖:

  href連接到的是文章正文頁,可是該連接並不是文章的實際連接地址,所以咱們須要點擊該連接到文章正文頁面獲取其真實連接。
其餘元數據信息則可由頁面直接獲取。具體獲取方法,即經過find_element定位到相應元素,獲取元素text信息,此處再也不
贅述。
  說明一下獲取文章實際url,可經過點擊文章標題或圖片跳轉到文章頁面,此時會新產生一個窗口,咱們須要切換到該窗
口,才能獲取到當前的窗口URL,而後再切換回原來的窗口,繼續下一個文章元數據的抓取過程,具體操做以下:
  
 1 def get_target_url(self, no):
 2         """
 3          get real url(without encryption) of target page
 4         :param no: NO.
 5         :return target_url:
 6         :Usage:
 7         """
 8         box_a = self.get_box(no).find_element_by_xpath("div[@class='txt-box']//h4//a")       # 找到標題元素並點擊
 9         current_handle = self.browser.current_window_handle   # 保留當前窗口句柄
10         box_a.click()
11         for handle in self.browser.window_handles:
12             if handle == current_handle:
13                 continue
14             else:
15                 # 切換到文章正文窗口,獲取url後關閉,並回到主窗口
16                 self.browser.switch_to_window(handle)
17                 target_url = self.browser.current_url
18                 self.browser.close()
19                 self.browser.switch_to_window(current_handle)
20                 return target_url    

三、抓取更多文章code

    初始頁面默認呈現10篇文章,點擊頁面底部「查看更多」可得到更多文章,每次10篇,若到達最後,則再也不出現「查看更多」。具體作法:htm

審查元素獲取「查看更多」並點擊,每一個文章對應一個div,其ID形式如「sogou_vr_11002601_box_0」,末尾的0是編號,順序遞增,查看blog

更多後,可經過該ID值獲取最新出現的文章。

  

 1 def get_more(self):
 2         try:
 3             more = self.browser.find_element_by_class_name("p-more")
 4             if more.get_attribute("style") == "visibility: hidden;":
 5                 return False
 6             else:
 7                 more.find_element_by_xpath("a").click()
 8                 return True
 9         except Exception, e:
10             print e.message
get_more

 

############################OVER################################

轉載請註明出處!!!

相關文章
相關標籤/搜索