機器能作的事就別讓人來作!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
############################OVER################################
轉載請註明出處!!!