- Selenium:用于模擬真實用戶在瀏覽器中操作。對于一些采用異步加載技術的網頁,如果難以用抓包來構造爬蟲,可以通過Selenium讓瀏覽器自動加載頁面,從而獲取所需的數據。
- PhantomJS:無界面瀏覽器,相比Chrome,Firefox等瀏覽器,意味著開銷小,速度快。
可直接在官網上下載:http://phantomjs.org/
1. PhantomJS的安裝
①下載PhantomJS文件后,解壓并將phantomjs.exe復制到系統路徑中,例如:C:\Python36
。
②運行下述代碼無誤,說明PhantomJS環境已經配置好。
from selenium import webdriver
driver = webdriver.PhantomJS()
2. PhantomJS的使用
以豆瓣為例:
from selenium import webdriver
driver = webdriver.PhantomJS() #指定瀏覽器
driver.get('https://www.douban.com') #請求URL
driver.implicitly_wait(8) #隱性等待8秒
driver.find_element_by_id("form_email").clear() #清楚輸入框數據
driver.find_element_by_id("form_email").send_keys('賬號') #輸入賬號
driver.find_element_by_id("form_password").clear()
driver.find_element_by_id("form_password").send_keys('密碼') #輸入密碼
driver.find_element_by_class_name("bn-submit").click() #單擊“登陸豆瓣”的按鈕
print(driver.page_source) #打印登陸后的源代碼
time.sleep()是強制等待指定的時間,如果時間定長了,會浪費時間。而implicitly_wait()函數完美地解決了這個entity,只要給定對應的時間參數,implicitly_wait()會進行智能等待,如果上面的代碼已經執行完畢,就會自動進入下一行代碼,不另外浪費時間。
運行成功后,可以用搜索功能查找一下自己的賬號名是否在源代碼中,如果存在,代表登陸成功。
3.使用selenium操作元素的常用方法有:
elem.send_keys("輸入內容")
elem.click() #鼠標單擊元素
elem.clear() #清除元素內容
4.獲取異步加載數據的方式:
對于單個元素:
find_elements_by_name
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_xpath
find_elements_by_css-selector
對于多個元素:
find_elements_by_name
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_xpath
find_elements_by_css-selector
一般而言,對于簡單的網頁結構,可以使用class,name, id來定位元素。對于稍微復雜的網頁結構,使用css或xpath均可。相對于xpath來說,css的格式調用更方便一些。
下面以簡書網的某篇文章為例,進行信息的爬取。
爬取網址:http://www.lxweimin.com/p/c80badcaa5bf
爬取方式:selenium + phantomJS
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("http://www.lxweimin.com/p/c80badcaa5bf")
driver.implicitly_wait(10)
author = driver.find_element_by_css_selector("span.name").text ##使用CSS方式
author1 = driver.find_element_by_xpath('//span[@class="name"]').text ##使用xpath方式,與上一句等價
date = driver.find_element_by_css_selector("span.publish-time").text
word = driver.find_element_by_css_selector("span.wordage").text
view = driver.find_element_by_css_selector("span.views-count").text
comment = driver.find_element_by_css_selector("span.comments-count").text
like = driver.find_element_by_css_selector("span.likes-count").text
reward = driver.find_element_by_css_selector("span.rewards-count ").text #其中,reward的信息沒辦法獲取。
print(author,date,word,view,comment,like,reward)
結果為:
小瓜皮玩數據 2017.08.17 21:43* 字數 1313 閱讀 704 評論 7 喜歡 9