python爬蟲(一)--------selenium+python+PhantomJS的使用
最近爬取相關網站時,發現沒有找到js包的地址,我就採用selenium來爬取資訊,相關實戰連結:python爬蟲實戰(一)--------中國作物種質資訊網
一、Selenium介紹
Selenium 是什麼?一句話,自動化測試工具。它支援各種瀏覽器,包括 Chrome,Safari,Firefox 等主流介面式瀏覽器,如果你在這些瀏覽器裡面安裝一個 Selenium 的外掛,那麼便可以方便地實現Web介面的測試。換句話說叫 Selenium 支援這些瀏覽器驅動。Selenium支援多種語言開發,比如 Java,C,Ruby等等,有 Python 嗎?那是必須的!安裝只要cmd中 pip install selenium 即可。
二、爬蟲為什麼要用selenium?
對於一般網站來說scrapy、requests、beautifulsoup等都可以爬取,但是有些資訊需要執行js才能顯現,而且你肉眼所能看到的基本都能爬取下來,在學習中遇到了,就記錄下來方便以後檢視。
webdrive是selenium中一個函式:
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get('網址')
其中PhantomJS同時可以換成Chrome、Firefox、Ie等等,但是PhantomJS是一個無頭的瀏覽器,執行是不會跳出相應的瀏覽器,執行相對效率較高。在除錯中可以先換成Chrome,方便除錯,最後再換成PhantomJS即可。
三、PhantomJS介紹
PhantomJS是一個基於webkit的JavaScript API。它使用QtWebKit作為它核心瀏覽器的功能,使用webkit來編譯解釋執行JavaScript程式碼。任何你可以在基於webkit瀏覽器做的事情,它都能做到。它不僅是個隱形的瀏覽器,提供了諸如CSS選擇器、支援Web標準、DOM操作、JSON、HTML5、Canvas、SVG等,同時也提供了處理檔案I/O的操作,從而使你可以向作業系統讀寫檔案等。PhantomJS的用處可謂非常廣泛,諸如前端無介面自動化測試(需要結合Jasmin)、網路監測、網頁截圖等。
四、PhantomJS安裝
本人windowns7系統,把下載下來的phantomjs.exe移到你所用python資料夾下的Script中就可以使用了。(下載PhantomJS-2.1.1-windowns.zip連結:http://pan.baidu.com/s/1c8HeBc 密碼:2zm4)
小測試:
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("http://hotel.qunar.com/")
data = driver.title
print data
#輸出
【去哪兒酒店】酒店預訂, 酒店查詢-去哪兒網Qunar.com
五、操作實戰
# -*-coding:utf-8-*-
from selenium import webdriver
import time
import win32api
import re
import win32con
browser = webdriver.PhantomJS()
'''PhantomJS的螢幕截圖是滾動底部的,而Chrome沒有'''
browser.get("http://flight.qunar.com/") #開啟去哪兒官網
a=browser.get_screenshot_as_file("E:/Python27/test2.jpg") #螢幕截圖
browser.find_element_by_id("searchTypeRnd").click() #點選往返
browser.find_element_by_xpath('//*[@id="dfsForm"]/div[2]/div[1]/div/input').clear() #先清理下輸入框,預設是有地方的
browser.find_element_by_xpath('//*[@id="dfsForm"]/div[2]/div[1]/div/input').send_keys(u"北京") #輸入起點位置
'''這裡涉及到win32api可以參考相關手冊----以下是鍵盤操作'''
time.sleep(0.5)
win32api.keybd_event(108,0,0,0) #按enter鍵
#按某個鍵 win32api.keybd_event(鍵位碼,0,0,0)
win32api.keybd_event(108,0,win32con.KEYEVENTF_KEYUP,0)#釋放按鍵
#釋放按鍵 win32api.keybd_event(鍵位碼,0,win32con.KEYEVENTF_KEYUP,0)
browser.find_element_by_xpath('//*[@id="dfsForm"]/div[2]/div[2]/div/input').clear()
browser.find_element_by_xpath('//*[@id="dfsForm"]/div[2]/div[2]/div/input').send_keys(u"上海") #輸入終點位置
time.sleep(0.5)
win32api.keybd_event(108,0,0,0) #按enter鍵
win32api.keybd_event(108,0,win32con.KEYEVENTF_KEYUP,0) #釋放按鍵
browser.find_element_by_xpath('//*[@id="fromDate"]').clear()
browser.find_element_by_xpath('//*[@id="fromDate"]').send_keys("2017-04-19") #輸入出發時間
#browser.find_element_by_xpath('//*[@id="fromDate"]').click()
browser.find_element_by_xpath('//*[@id="toDate"]').clear()
browser.find_element_by_xpath('//*[@id="toDate"]').send_keys("2017-04-22") #輸入返程時間
#browser.find_element_by_xpath('//*[@id="toDate"]').click()
'''法二設定地點和時間'''
#browser.find_element_by_name("name").send_keys("北京(BJS)") #設定值
#browser.find_element_by_name("pass").send_keys("上海(SHA)") #設定值
#browser.find_element_by_id("txtAirplaneTime1").send_keys("2016-12-19") #設定值
browser.find_element_by_xpath('//*[@id="dfsForm"]/div[4]/button').click() #點選按鈕 提交表單
browser.maximize_window() #最大視窗
'''儲存當前網頁'''
print(browser.current_url) #當前url
#browser.get("http://www.ly.com/FlightQuery.aspx")#cookie儲存在物件中,對需認證頁面可直接訪問
data=browser.page_source.encode("utf-8","ignore")
fh=open("E:/python27/qun.html","wb")
fh.write(data)
fh.close()
data2=browser.page_source
#print data2
a=browser.get_screenshot_as_file("E:/Python27/test.jpg")
#print(browser.page_source)
''''後續可以抓取一些東西'''
browser.quit()
六、在此推薦蟲師部落格的學習資料
下面會用 selenium + webdriver + python 實現
關係:
selenium 自動化測試工具 :selnium 1.0 包括:selenium RC 、selenium IDE 、selenium GRID、selenium CORE
webdriver google的自動化測試框架(或者說是套規範API)
webdriver 與seleinum 各有優點,兩個團隊都認為合併會更牛逼,於是:
selenium 2.0 = selenium RC + webdriver
selenium 可以使用多種語言實現:C# , java , python , ruby ....
環境搭建:
----------------輕鬆自動化系列目錄-----------
開始我們的第一個指令碼:
- 熟悉selenium python 程式碼樣式
- time.sleep() 新增休眠時間
- print 列印輸出資訊
- 列印URL
- 將瀏覽器最大化
- 設定瀏覽器固定寬、高
- 操控瀏覽器前進、後退
* 簡單物件定位:
- · id
- · name
- · class name
- · link text
- · partial link text
- · tag name
- · xpath
- · css selector
- 定位一組元素
- 層級定位
操作物件:
- · click 點選物件
- · send_keys 在物件上模擬按鍵輸入
- · clear 清除物件的內容,如果可以的話
WebElement 另一些常用方法:
- · text 獲取該元素的文字
- · submit 提交表單
- · get_attribute 獲得屬性值
多層框架或視窗的定位:
- switch_to_frame()
- switch_to_window()
智慧等待:
- implicitly_wait()
呼叫js方法
execute_script(script, *args)
- 上傳檔案
- 處理下拉框
- switch_to_alert()
- accept()
- 控制滾動條到底部
- l 鍵盤按鍵用法
- l 鍵盤組合鍵用法
- l send_keys() 輸入中文執行報錯問題
- driver.get_cookies() 獲得cookie資訊
- add_cookie(cookie_dict) 向cookie新增會話資訊
- delete_cookie(name) 刪除特定(部分)的cookie
- delete_all_cookies() 刪除所有cookie
-
webdriver 原理分析
- context_click() 右擊
- double_click() 雙擊
- drag_and_drop() 拖動
- 淺析unittest測試框架
作者:今孝 出處:http://www.cnblogs.com/jinxiao-pu 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線。
參考連結:http://www.cnblogs.com/zzhzhao/p/5380376.html
http://www.cnblogs.com/BigFishFly/p/6380024.html