雖然PhantomJS的開發(fā)者已經(jīng)停止更新了备徐,但現(xiàn)存版本依舊可以使用,仍然可以用來解決爬蟲中遇到的某些問題甚颂,所以還是很值得了解學習一下的蜜猾。
(1)下載:https://phantomjs.org/download.html
(2)安裝:
①解壓壓縮包到指定目錄;
②將~/phantomjs/bin添加到主機環(huán)境變量中振诬,在cmd中輸入>>>phantomjs蹭睡,進入phantomjs shell即為配置成功;
③要在python IDLE中使用phantomjs贷揽,還必須安裝selenium模塊棠笑。
(3)基本爬蟲使用方法:
前提:from selenium import webdriver
①打開
>>>browser=webdriver.PhantomJS()
②瀏覽網(wǎng)頁
>>>url="http://www.baidu.com"
>>>browser.get(url)
③直接把爬取的網(wǎng)頁截圖
>>>browser.get_screenshot_as_file("G:/DA/file/pjs1.png")
④直接獲取頁面源代碼
page_code=browser.page_source
⑤正則表達式提取網(wǎng)頁title
Import re
pat_title="<title>(.*?)</title>"
title1=re.compile(pat_title).findall(page_code)
print(title1)
⑥xpath表達式提取網(wǎng)頁title(必須先將page_code轉為tree梦碗,再進行xpath提惹菪鳌)
from lxml import etree
edata=etree.HTML(page_code)
title2=edata.xpath("/html/head/title/text()")
print(title2)
⑦關閉瀏覽器
>>>browser.quit()
(4)實現(xiàn)自動登錄豆瓣
①短信登錄
②賬號密碼登錄
【注】WebDriver8種基本元素定位方法:
①find_element_by_id():根據(jù)id屬性進行定位;
例如:find_element_by_id(“one”)定位id為one的元素洪规。
②find_element_by_name():根據(jù)name屬性進行定位印屁;
例如:find_element_by_name(“one”):定位name屬性為one的元素。
③find_element_by_class_name():根據(jù)class的名字進行定位斩例;
例如:find_element_by_class_name(“one”)定位class為one的元素雄人。
④find_element_by_xpath():xpath是XML路徑語言,通過確定xml文檔中的元素位置來完成對元素的定位念赶;
例如:find_element_by_xpath("http://div[@id=‘one']")定位id為one的div元素础钠;find_element_by_xpath("http://*[@class=‘two']")定位class為two的元素。
⑤find_element_by_css_selector():根據(jù)css屬性進行定位叉谜;
例如:find_element_by_css_selector("#one")定位id為one的div元素旗吁;find_element_by_css_selector(".two")定位class為two的元素。
⑥find_element_by_tag_name ():根據(jù)標簽名進行定位停局;
例如:find_element_by_tag_name(“input”)定位input元素很钓。
⑦find_element_by_link_text():根據(jù)完整a鏈接文字進行定位find_element_by_partial_link_text() 根據(jù)部分a鏈接文字進行定位;
例如:find_element_by_link_text(“新聞”) 定位文字為‘新聞'的a元素董栽;find_element_by_partial_link_text(“聞”) 定位文字包括‘聞'的a元素码倦。
⑧By定位( 需要導入By類:from selenium.webdriver.common.by import By );
例如:find_element(By.ID,“one”)定位id為one的元素锭碳;find_element(By.NAME,“one”)定位name屬性為one的元素袁稽;find_element(By.CLASS_NAME,“one”)定位class為one的元素;find_element(By.TAG_NAME,“div”)定位div元素擒抛。
Ps:當定位元素為多個時推汽,使用elements復數(shù)定位蝗柔,即把定位方法中的element換成elements,此時獲取到的為相同屬性的一組元素民泵,返回一個list隊列癣丧,然后可以再去定位單個元素;
例如:find_elements_by_class_name(“one”)[1]栈妆,定位class為one的所有元素中第二個元素胁编。