PhantomJS
首先簡單介紹一下PhantomJS宴猾,它是一款沒有界面的瀏覽器圆存,也就是說PhantomJS并不是給普通用戶瀏覽使用,它運(yùn)行時在屏幕上是看不到的仇哆。相較于傳統(tǒng)的界面瀏覽器沦辙,PhantomJS占用的內(nèi)存更少,且大量爬蟲時不會出現(xiàn)滿屏的網(wǎng)頁讹剔,所以你可以一邊悠閑地上上網(wǎng)聊聊天油讯,一般讓爬蟲后臺運(yùn)行。
Selenium
Selenium是一款模擬點(diǎn)擊網(wǎng)頁+爬蟲的插件延欠,一般和PhantomJS結(jié)合使用(也可以使用其他無界面瀏覽器)陌兑。這里啰嗦一下模擬點(diǎn)擊的原理。不同于手機(jī)模點(diǎn)由捎,由于各種電腦的分辨率和網(wǎng)頁打開頁面大小的不同兔综,網(wǎng)頁爬蟲的點(diǎn)擊不是選一個坐標(biāo)點(diǎn),然后給個click事件狞玛,而是分析網(wǎng)頁生成的html代碼软驰,取得某一個元素,如div心肪,方才給與點(diǎn)擊锭亏。
實(shí)戰(zhàn)及注解
說了這么多,下面舉一個簡單的例子讓大家加深印象蒙畴。代碼是用Python寫的贰镣,我會在每一行下面作注解。
----------------
from selenium import webdriver
#將selenium模塊導(dǎo)進(jìn)來
import time
#導(dǎo)入time模塊膳凝,以便之后爬蟲等待
driver=webdriver.PhantomJS()
#引用PhantomJS
driver.set_window_size(1920,1080)
#設(shè)置PhantomJS窗口大小碑隆,因?yàn)闆]有實(shí)體界面,所以大小隨便設(shè)
driver.get("http://lovecrazy.cn")
#輸入要爬的網(wǎng)站地址
driver.find_element_by_id("ls_username").send_keys("測試")
driver.find_element_by_id("ls_password").send_keys("ceshi123")
driver.find_element_by_xpath("http://*[@id='lsform']/div/div/table/tbody/tr[2]/td[3]/button").click()
#以上三行做了輸入賬號密碼及點(diǎn)擊事件蹬音。find_element_by_id()先獲取元素輸入的位置上煤,send_keys()中寫要輸入的內(nèi)容。尋找位置的幾種方法后面詳細(xì)講著淆。
time.sleep(2)//加載新頁面需要時間劫狠,讓瀏覽器先喘口氣拴疤,這里暫且讓它緩2秒
data=driver.find_element_by_xpath("http://*[@id='g_upmine']").text
print(data)
#以上兩行只是個測試,顯示登錄成功后的用戶組独泞。
------------
獲取元素的方法
下面講一下怎么獲取需要點(diǎn)擊或爬取的元素呐矾。這里只說一下萬能方法:
筆者采用Chrome內(nèi)核的瀏覽器。谷歌瀏覽器懦砂,QQ瀏覽器蜒犯,360瀏覽器都可以。打開網(wǎng)頁后Wndows操作系統(tǒng)按F12荞膘,Mac則按option+command+c罚随,也可依次右鍵,檢查羽资。點(diǎn)擊新增界面左上角的鼠標(biāo)箭頭淘菩,再點(diǎn)擊網(wǎng)頁上要查找的元素,右鍵加深代碼屠升,依次選擇Copy潮改,Copy XPATH,最后將代碼粘貼到driver.find_element_by_xpath("")括號中即可(別忘可把貼進(jìn)來代碼里的雙引號改成單引號弥激,否則會報(bào)錯进陡。
非萬能方法耗時間,一般需要查找元素的id微服,class等標(biāo)簽,這里不推薦缨历。
坑
這里有個坑以蕴,你在網(wǎng)頁點(diǎn)開一個鏈接后會發(fā)現(xiàn)獲取不到新頁面的數(shù)據(jù)。這是因?yàn)槿绻c(diǎn)擊后打開了新窗口辛孵,程序獲取的還是老窗口的內(nèi)容丛肮,這里只需加一行driver.switch_to.window(driver.window_handles[1]),方括號中可填0魄缚,1和-1宝与。0代表第一個窗口,1代表最后一個窗口冶匹,-1為當(dāng)前顯示的窗口习劫。
快結(jié)束了
最后說一下獲取爬的內(nèi)容,其實(shí)很簡單嚼隘,只需在driver.find_element_by_xpath("")加.text或.value即可诽里。(print就不用我說了,地球人都知道)
因?yàn)楣ぷ餍枰P者采用PhantomJS+Selenium飞蛹,但是讀者若運(yùn)行我的代碼會發(fā)現(xiàn)谤狡,python給出一行警告(可無視)灸眼,大意是PhantomJS已經(jīng)被開放商放棄了,請用其他無界面瀏覽器墓懂。這次使用這個插件也是嘗試焰宣,其實(shí)無頭瀏覽器大同小異,學(xué)會PhantomJS再使用其他瀏覽器已是輕車熟路了捕仔。后期如果有機(jī)會我會更新Chrome無頭版的爬蟲方式宛徊。
THE END
本文為“愛鋒程序猿”原創(chuàng),轉(zhuǎn)載請寫明出處逻澳。