Python網路資料採集之審查元素

weixin_33860722發表於2017-08-24

普通的網路資料可使用get或post方法來採集得到,而有些網站原始碼只能通過審查元素的方式才可以看到,本文介紹如何使用Python程式碼實現審查元素的網路資料採集方法。

使用Python實現通過審查元素採集資料需要用到selenium庫,具體實現步驟如下:

  • 官網下載selenium並安裝,編寫Python測試指令碼。

      from selenium import webdriver
    
      browser = webdriver.Firefox();
      browser.get("http://www.baidu.com");
    
  • 執行指令碼報以下錯誤:

      WebDriverException: Message: ‘geckodriver‘ executable needs to be in PATH. 
    

是因為 selenium 3.x開始,webdriver/firefox/webdriver.py的init中,executable_path="geckodriver";並且firefox 47以上版本,需要下載第三方driver,即geckodriver。

  • 下載對應版本的瀏覽器驅動geckodriver,解壓後將geckodriver.exe放置到firefox安裝目錄,並將該目錄寫入“環境變數-系統變數-Path”中。

  • 再次執行指令碼可能會報以下錯誤:

      WebDriverException: Message: Unable to find a matching set of capabilities
    

首先,檢查本機java版本,selenium3.x只支援java8版本以上;其次,檢查firefox瀏覽器版本,將firefox47解除安裝,安裝最新版本的firefox版本57。兩者無誤後,即可成功,親測有效。

  • 執行指令碼無報錯後,可寫採集網路資料的程式碼,如下所示。

      # -*- coding:utf-8 -*-
      from bs4 import BeautifulSoup
      from selenium import webdriver
      import re,requests,sys,json,random,time
      import os
          
      chromedriver = "D:\Program Files\Mozilla Firefox\geckodriver"
      driver = webdriver.Firefox(executable_path = chromedriver)
              
      totelPage = 200
      page = 1
      head = 'http://apps.webofknowledge.com'
      f = open('WOS_file.csv','w')
      while page <= totelPage:
          print "Page %i ..." % ( page )
      
          url = 'http://apps.webofknowledge.com/summary.do?product=WOS&parentProduct=WOS&search_mode=GeneralSearch&parentQid=&qid=1&SID=U2NEeEDm3nTK7peYwWt&&update_back2search_link_param=yes&page=' + str(page)
          driver.get(url)
          try:
              sourcePage = driver.page_source
              soup = BeautifulSoup(sourcePage,"html.parser")
              urls = soup.find_all("a", class_="smallV110", href=re.compile("full_record.do"),attrs={"tabindex":"0"})
              print(len(urls))
            
              for r_url in urls:
                  list_url = head + str(r_url.attrs['href'])
                  f.writelines(list_url +  '\n')
          finally:
              pass
      
          time.sleep(random.randint(5,10)/10.0)
          page += 1
              
      driver.quit()
      print "done..."
      f.close()
    

本例中主要使用了兩個用於採集的第三方庫webdriver和BeautifulSoup。其中,driver.page_source用於獲取審查元素的網頁原始碼;BeautifulSoup(sourcePage,"html.parser")將網頁原始碼梳理成網格;BeautifulSoup中的find_all方法用於查詢匹配資訊。這也是網路資料採集常用庫和方法,兩個庫的API可參考官方手冊或相關博文,在此不贅述。

相關文章