搜狗微信公眾號文章抓取


機器能做的事就別讓人來做!

目標: 抓取特定微信公眾號文章

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

框架:

  

步驟:

1、登錄搜狗

  a、找到登錄按鈕並點擊

  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頭像對應的元素位置並點擊

2、抓取文章

  搜狗頁面呈現方式:
























抓取數據格式:
  標題, 概要信息, 發布時間, 圖片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    

3、抓取更多文章

    初始頁面默認呈現10篇文章,點擊頁面底部“查看更多”可獲得更多文章,每次10篇,若到達最后,則不再出現“查看更多”。具體做法:

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

更多后,可通過該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################################

轉載請注明出處!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM