機器能做的事就別讓人來做!
目標: 抓取特定微信公眾號文章
思路:利用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
############################OVER################################
轉載請注明出處!!!