從零開始寫Python爬蟲 --- 3.1 Selenium模擬瀏覽器
本來說好要寫Mechanize模擬瀏覽器的,結果一看居然只支持2.x版本的Python,而且已經長久沒有更新維護了,本著學新不學舊的原則,我決定跳過他,直接開學Selenium(其實就是我懶,逃
Selenium的介紹:
為什麼我們要使用這個包呢?在寫Python爬蟲的時候,最麻煩的不是那些海量的靜態網站,而是那些通過JavaScript獲取數據的站點。Python本身對js的支持就不好,所以就有良心的開發者來做貢獻了,這就是Selenium,他本身可以模擬真實的瀏覽器,瀏覽器所具有的功能他一個都不拉下,載入js更是小菜了。
Selenium的安裝:
安裝起來依舊很簡單,我們用pip工具安裝:
pip install seleniumn
現在Selenium的最新版本是3.4.2
找到一分還不錯的中文文檔:
Selenium with Python中文翻譯文檔瀏覽器的選擇:
在寫爬蟲的時候,用到最多的就是Selenium的Webdriver,
當然,webdriver也不可能支持所有的瀏覽器,讓我們看看他支持哪些瀏覽器吧:
ipythonnfrom selenium import webdrivernhelp(webdriver)nn# OUT:nnPACKAGE CONTENTSn android (package)n blackberry (package)n chrome (package)n common (package)n edge (package)n firefox (package)n ie (package)n opera (package)n phantomjs (package)n remote (package)n safari (package)n support (package)n
可以看到,Selenium支持的瀏覽器還是非常豐富的,
無論是移動端的Android、blackberry還是我們電腦常用的Chrome,Safari,Firefox。然而,在寫爬蟲的 時候,我推薦使用PhantomJS:PhantomJS是一個而基於webkit的伺服器端的JS API。
他全面支持各種原生的Web標準:DOM處理、CSS選擇器、JSON、Canvas和SVG。最重要的是他是一個沒有GUI的程序,
也就意味著他可以省去大量的載入圖形界面的時間。
有人曾經測試過,使用Selenium模塊調用上述瀏覽器,PhantomJS的速度是第一名哦~
第二和第三是chrome和ie。
PhantomJS的安裝:
這裡有一點要說明,PhantomJS並不是一個Python模塊,他是一個獨立的,第三方軟體,這也就意味著我們不能簡單的使用pip工具安裝啦。
這裡我們只要使用brew工具就能安裝上PhantomJs了
brew install phantomjsn
如果你的mac還沒有安裝過Brew,只需要下面行命令就能成功安裝了:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"n
- linux下安裝PhantomJS:
linux下有很多第三方髮型版本:
比較常用的一般是 Ubuntu、centos等等
這些發行版也都有自己強大的軟體管理倉庫:apt、yum等等那麼安裝起來也就超方便了:
# ubuntunapt-get install phantomjsnn# centosnyum install phantomjsn
- win下安裝PhantomJS:
雖然win下沒有上述的方便的安裝方式,
但是我們可以去官網下載安裝包,然後在安裝地址在這:Download | PhantomJS使用Selenium&PhantomJS抓取數據:
本著第一個例子一定要簡單明了,我們拿百度開刀:
打開百度首頁:
我們用ipython來進行試驗:
ipythonnnIn [1]: from selenium import webdrivernnIn [2]: browser = webdriver.PhantomJS()nnIn [3]: url = https://www.baidu.comnnIn [4]: browser.get(url)nnIn [5]: browser.implicitly_wait(3)n
我們首先導入了Selenium里的webdriver,
然後建立一個PhantomJS的瀏覽器對象,最後我們通過get方法,打開了百度的首頁。這裡要說一下 implicitly_wait():瀏覽器解釋JS腳本是需要時間的,但實際上這個時間並不好確定,
如果我們手動設定時間間隔的話,設置多了浪費時間,設置少了又會丟失數據implictly_wait函數則完美解決了這個問題,給他一個時間參數,他會只能等待,當js完全解釋完畢就會自動執行下一步。
找到搜索框和搜索按鈕:
在第一步的時候,我們其實就已經把百度首頁的數據爬到本地了,
剩下當然是數據的篩選,這裡推薦用Selenium的自帶函數來完成,
Selenium 本事給出了18個函數來定位有效數據的位置:# 找到第一個匹配的元素nfind_element_by_idnfind_element_by_namenfind_element_by_xpathnfind_element_by_link_textnfind_element_by_partial_link_textnfind_element_by_tag_namenfind_element_by_class_namenfind_element_by_css_selectornn# 一次查找多個元素 (這些方法會返回一個list列表):nfind_elements_by_namenfind_elements_by_xpathnfind_elements_by_link_textnfind_elements_by_partial_link_textnfind_elements_by_tag_namenfind_elements_by_class_namenfind_elements_by_css_selectorn
相信在用過bs4和Xpath之後,用這個完全沒有什麼壓力吧,
看函數名就應該知道是具體通過什麼來定位數據了上面我們只是打開了百度而已,
我們在使用真實瀏覽器的時候是不是要現在文本框里輸入關鍵詞然後在按搜索按鈕呢?
在PhantomJS里我們也需要這樣做:
In [6]: text = browser.find_element_by_id(kw)nnIn [7]: text.clear()nnIn [8]: text.send_keys(python)nnIn [9]: browser.titlenOut[9]: python_百度搜索nnIn [10]: button = browser.find_element_by_id(su)nnIn [11]: button.submit()n
用chrome開發者工具可以快速定位到各個element的位置:
我們首先調用find_element_by_id()方法找到了text欄的位置,
然後通過send_keys()方法來輸入關鍵字接著還是通過find_element_by_id()方法找到提按鈕,最後我們通過.submint()方法來模擬點擊,發送搜索請求讓我們來篩選答案吧:
In [13]: results = browser.find_elements_by_class_name(t)nnIn [14]: for result in results:n ...: print(標題:{} 超鏈接:{}.format(result.text,n ...: result.find_element_by_tag_name(a).gen ...: t_attribute(href)))nn# 結果節選:n標題:Welcome to Python.org官網 超鏈接:http://www.baidu.com/link?url=AfMsWMp47YyrqHsvNqAUV_I79v7x7_V50FRhffEqyzCn標題:Python_百度百科 超鏈接:http://www.baidu.com/link?url=O_mv6kHvjl4aHJnIy5RslTb4HGxiqCQ5Aa8jxvL738E66QIh6YutyPaTLzSkgF_oR6csfMZl3fBcvk899HTvOqn標題:Download Python | Python.org 超鏈接:http://www.baidu.com/link?url=MiTrsrkdbR9MsqAKqPQB0gg_qq1vNjitwo6JXs-epElh1PRopw0iwylA2J7zOPK1n標題:Python 基礎教程 | 菜鳥教程 超鏈接:http://www.baidu.com/link?url=87DkBMsuYKPIErgWyHQ8gYARtiajq2Be7CuCkwaVGAUYJ6S9-PenmAKVzZ4p4LL5dev4h1-BX1xNiRQmGueNv_n標題:Mac版 Python最新官方版下載_百度軟體中心 超鏈接:http://www.baidu.com/link?url=NXz2Ztu2_uEIr98kwl5mDdxeyIfiuZYVqb82llW_azuGiSudgeZinDvvUgtUMhCEbOdzHqBpTE-nnMZSH3FT2qn標題:玩蛇網 - Python教程學習與Python資源分享平台 超鏈接:http://www.baidu.com/link?url=owZ9vkSBVqs3isRCbwIFtOqzT44ChUW8WaNwC0ZJtcxa4YcRAD3ioTduKOgGyyJbn標題:python吧_百度貼吧 超鏈接:http://www.baidu.com/link?url=1xbKTtfvuOddE83Pj9AnKOywjwlwlvTQTyqtNSKwJZ19QPgyMQye3HgwPsaneR5221CzJ07I0MGS2pcGFX8rCqn標題:Python 簡介 | 菜鳥教程 超鏈接:http://www.baidu.com/link?url=mNZA6drSbW4EJIMd5-qNRnqk6C5wvZozyE-nmJfy2EOPDPe5p75orkw5oKQ4USkjSTCt6bCRhaKlHgWHIMtBlKn標題:Python教程 - 廖雪峰的官方網站 超鏈接:http://www.baidu.com/link?url=qmDG-Rbus9jnQZvvWvS3gjVnqUPTFlEbIWWvPisvfrSEEf7r4pieLJVT6S3XslKBZgXzmezFEYH3tv9AIKDyycbcbZeITZNIb5RR6Xn6qAE3Sgibs4mMmre6PXqXMNDBn
這次我們通過browser.find_elements_by_class_name()方法定位到搜索結果,
返回一個element類型的列表,
再通過element.text 和 element.get_attribute()方法來獲取我們需要的數據。最後我們遍歷一邊results列表就能獲得我們想要的答案了。來看一下完整的代碼:
n使用Selenium模擬瀏覽器n抓取百度查詢結果nnn# 導入selenium模塊中的web引擎nfrom selenium import webdrivernnn# 建立瀏覽器對象 ,通過Phantomjsnbrowser = webdriver.PhantomJS()nn# 設置訪問的urlnurl = https://www.baidu.comnn# 訪問urlnbrowser.get(url)nn# 等待一定時間,讓js腳本載入完畢nbrowser.implicitly_wait(3)nn# 找到搜索框ntext = browser.find_element_by_id(kw)nn# 清空搜索框的文字ntext.clear()nn# 填寫搜索框的文字ntext.send_keys(python)nn# 找到submit按鈕nbutton = browser.find_element_by_id(su)nn# 點擊按鈕 提交搜索請求nbutton.submit()nnn# 查看當前瀏覽器標題nprint(browser.title)nn# 以截圖的方式查看瀏覽器的頁面nbrowser.save_screenshot(text.png)nn# 找到結果 結果保存為列表變數nresults = browser.find_elements_by_class_name(t)nn# 循環遍歷找出每個結果的標題和urlnfor result in results:n print(標題:{} 超鏈接:{}.format(result.text,n result.find_element_by_tag_name(a).get_attribute(href)))n
這裡只是簡單介紹了如何通過Selenium和PhantomJS來模擬瀏覽器抓取數據,後面會再來幾個實戰的例子。
每天的學習記錄都會 同步更新到:
微信公眾號: findyourownway知乎專欄:從零開始寫Python爬蟲 - 知乎專欄blog : www.ehcoblog.mlGithub: Ehco1996/Python-crawler
推薦閱讀:
※Trip: 給Requests加上協程,一百份網路請求一份時間
※如何在瀏覽器中高效抓包分析數據?
※Scrapy爬圖片(一)
※未來的旅遊的熱點是什麼?旅遊點評數據分析
※從零開始寫Python爬蟲 --- 2.6 爬蟲實踐:重構排行榜小說爬蟲&Mysql資料庫