09.python之網絡爬蟲之selenium、phantomJs和谷歌無頭瀏覽器的自動化操做

1、seleniumhtml

  • 什麼是selenium?
    • 是Python的一個第三方庫,對外提供的接口能夠操做瀏覽器,而後讓瀏覽器完成自動化的操做。  web

  • 環境搭建chrome

    • 安裝selenum:pip install seleniumwindows

    • 獲取某一款瀏覽器的驅動程序(以谷歌瀏覽器爲例)api

      • 谷歌瀏覽器驅動下載地址:http://chromedriver.storage.googleapis.com/index.html瀏覽器

      • 下載的驅動程序必須和瀏覽器的版本統一,你們能夠根據http://blog.csdn.net/huilan_same/article/details/51896672中提供的版本映射表進行對應less

          效果展現:ide

  from selenium import webdriver   from time import sleep   # 建立瀏覽器對象,後面是你的瀏覽器驅動位置,記得前面加r'','r'是防止字符轉義的   bai = webdriver.Chrome(executable_path=r'D:\pycharm\exercise\13.爬蟲\day4\谷歌瀏覽器驅動\chromedriver.exe')   # 同過get發送請求   bai.get(url='https://www.baidu.com')   # 根據find系列的函數定位到指定的標籤   my_input = bai.find_element_by_id("kw")   sleep(3)   # 向標籤中指定錄入的內容   my_input.send_keys("美女")   sleep(3)   # 根據find系列的函數定位到指定的標籤   my_button = bai.find_element_by_id("su").click()   sleep(3)   # 獲取當前瀏覽器顯示的頁面的頁面源碼   page_text = bai.page_source   #關閉瀏覽器   bai.quit()

 代碼解釋:函數

#導包 from selenium import webdriver #建立瀏覽器對象,經過該對象能夠操做瀏覽器 browser = webdriver.Chrome('驅動路徑') #使用瀏覽器發起指定請求 browser.get(url) #使用下面的方法,查找指定的元素進行操做便可 find_element_by_id 根據id找節點 find_elements_by_name 根據name找 find_elements_by_xpath 根據xpath查找 find_elements_by_tag_name 根據標籤名找 find_elements_by_class_name 根據class名字查找

#像指定的標籤元素中錄入指定的內容
   send_keys("指定輸入的內容")

page_source 獲取當前瀏覽器顯示的頁面的頁面源碼
quit() 關閉瀏覽器

  示例:自動化登錄qq空間,並獲取部分好友動態信息 網站

   
 1 from selenium import webdriver  2 from time import sleep  3 from lxml import etree  4 
 5 # 爬取qq空間內容  6 bro= webdriver.Chrome(executable_path=r'D:\pycharm\exercise\13.爬蟲\day4\谷歌瀏覽器驅動\chromedriver.exe')  7 
 8 url = 'https://qzone.qq.com/'
 9 
10 bro.get(url=url) 11 sleep(1) 12 
13 # 定位到指定的iframe, switch_to.frame() 定位到當前指定元素 14 bro.switch_to.frame('login_frame') 15 bro.find_element_by_id('switcher_plogin').click() 16 sleep(1) 17 
18 username = bro.find_element_by_id("u") 19 username.send_keys('169675573') 20 password = bro.find_element_by_id("p") 21 password.send_keys('xxxxxx') 22 sleep(1) 23 bro.find_element_by_id('login_button').click() 24 sleep(2) 25 
26 # 拿到登錄以後的頁面 27 page_text = bro.page_source 28 sleep(5) 29 
30 
31 tree = etree.HTML(page_text) 32 div_list = tree.xpath('//div[@class="f-info qz_info_cut"] | div[@class="f-info"]') 33 for div in div_list: 34     text = div.xpath('./text(text)') 35     text = "".join() 36  print(text) 37 print("下載完成!!!") 38 bro.quit()
實現代碼

 

2、 phantomJs

  • PhantomJS是一款無界面的瀏覽器,其自動化操做流程和上述操做谷歌瀏覽器是一致的。
  • 因爲是無界面的,爲了可以展現自動化操做流程,PhantomJS爲用戶提供了一個截屏的功能,使用save_screenshot函數實現。

  效果展現:

  # 無界面瀏覽器的使用   from selenium import webdriver   from time import sleep   #建立瀏覽器對象,經過該對象能夠操做瀏覽器,後面是你的瀏覽器驅動位置,記得前面加r'','r'是防止字符轉義的   bai = webdriver.PhantomJS(executable_path=r'D:\pycharm\exercise\13.爬蟲\day4\phantomjs-2.1.1-windows\bin\phantomjs.exe')   # 同過get發送請求   bai.get(url='https://www.baidu.com')   bai.save_screenshot('./1.jpg') # 截圖 在無界面執行的時候截取當前執行動做   # 根據find系列的函數定位到指定的標籤   my_input = bai.find_element_by_id("kw")   sleep(3)   # send_keys 向標籤中指定錄入的內容   my_input.send_keys("美女")   sleep(3)   # 根據find系列的函數定位到指定的標籤   my_button = bai.find_element_by_id("su").click()   sleep(3)   # 獲取當前瀏覽器顯示的頁面的頁面源碼   page_text = bai.page_source   bai.save_screenshot('./2.jpg') # save_screenshot函數實現截圖功能   print(page_text)   # 關閉瀏覽器   bai.quit() 

 

  selenium 和 phantomJs 實現的功能是同樣的,都須要指定驅動程序,

  不一樣的:

     selenium:是Python的一個第三方庫,對外提供的接口能夠操做瀏覽器,而後讓瀏覽器完成自動化的操做。

       phantomJs:是一款無界面的瀏覽器,其自動化操做流程和上述操做谷歌瀏覽器是一致的

 

3、谷歌無頭瀏覽器

  因爲PhantomJs最近已經中止了更新和維護,因此推薦你們可使用谷歌的無頭瀏覽器,是一款無界面的谷歌瀏覽器

  在使用谷歌無頭瀏覽器的時候,須要導入一個包,並建立參數對象,並在建立瀏覽器對象的時候,將建立的參數對象,添加到瀏覽器驅動位置的後面,便可使用谷歌無頭瀏覽器

    導入包:

    from selenium.webdriver.chrome.options import Options      

     建立一個參數對象,用來控制chrome以無界面模式打開:
      chrome_options = Options()
      chrome_options.add_argument('--headless')
      chrome_options.add_argument('--disable-gpu')

    將建立的參數對象添加到瀏覽器對象的驅動位置後面:

     webdriver.Chrome('驅動路徑', chrome_options=chrome_options)

  效果展現:

  # 谷歌無頭瀏覽器   from selenium import webdriver   from time import sleep   # 導入指定包   from selenium.webdriver.chrome.options import Options      # 建立一個參數對象,用來控制chrome以無界面模式打開   chrome_options = Options()   chrome_options.add_argument('--headless')   chrome_options.add_argument('--disable-gpu')   bai = webdriver.Chrome(executable_path= r'D:\pycharm\exercise\13.爬蟲\day4\谷歌瀏覽器驅動\chromedriver.exe',chrome_options=chrome_options)   # 同過get發送請求   bai.get(url='https://www.baidu.com')   # 根據find系列的函數定位到指定的標籤   my_input = bai.find_element_by_id("kw")   sleep(3)   # 向標籤中指定錄入的內容   my_input.send_keys("美女")   sleep(3)   # 根據find系列的函數定位到指定的標籤   my_button = bai.find_element_by_id("su").click()   sleep(3)   # 獲取當前瀏覽器顯示的頁面的頁面源碼   page_text = bai.page_source   print(page_text)   # 關閉瀏覽器   bai.quit()

 selenium+phantomjs 就是爬蟲終極解決方案:

   有些網站上的內容信息是經過動態加載js造成的,因此使用普通爬蟲程序沒法回去動態加載的js內容。例如豆瓣電影中的電影信息是經過下拉操做動態加載更多的電影信息。

  示例:需求是儘量多的爬取豆瓣網中的電影信息

  from selenium import webdriver   from time import sleep   bro= webdriver.Chrome(executable_path=r'D:\pycharm\exercise\13.爬蟲\day4\谷歌瀏覽器驅動\chromedriver.exe')   url = 'https://movie.douban.com/typerank?type_name=%E7%88%B1%E6%83%85&type=13&interval_id=100:90&action='   # 請求發送   bro.get(url=url)   # 獲取當前網頁頁面顯示的高度   js = "window.scrollTo(0,document.body.scrollHeight)"   # 執行js代碼,execute_script該函數能夠執行一組字符串形式的js代碼   bro.execute_script(js)   sleep(2)   bro.execute_script(js)   sleep(2)   bro.execute_script(js)   sleep(2)   bro.execute_script(js)   sleep(2)   page_text = bro.page_source # page_source 該屬性能夠獲取當前瀏覽器的當前頁的源碼(html)   with open("./douban.html","w",encoding="utf-8") as fp:    fp.write(page_text)   bro.quit()
相關文章
相關標籤/搜索