javascript
PhantomJS+Selenium爬取淘宝
文章目錄
- 動(dòng)態(tài)網(wǎng)頁處理
- PhantomJS
- Selenium
- 處理異步請(qǐng)求
- 模擬鍵盤操作
- 頁面等待
- 顯示等待
- 隱式等待
 
- Phantomjs+Selenuim爬取淘寶
 
動(dòng)態(tài)網(wǎng)頁處理
很多網(wǎng)站都采用AJAX技術(shù),SPA技術(shù),部分內(nèi)容都是異步動(dòng)態(tài)加載的。可以提高用戶體驗(yàn)。
 但是,對(duì)于爬蟲程序爬取到的HTML頁面相當(dāng)于頁面模板,動(dòng)態(tài)內(nèi)容不再其中。
 解決辦法之一,如果能構(gòu)造一個(gè)包含JS引擎的瀏覽器,讓它加載網(wǎng)頁并和網(wǎng)站交互,我們編程從這個(gè)瀏覽器獲取內(nèi)容包括動(dòng)態(tài)內(nèi)容。
PhantomJS
它是一個(gè)headless無頭瀏覽器,支持JavaScript。可以運(yùn)行在windows、linux、mac os等。所謂的無頭瀏覽器就是包含JS引擎,瀏覽器排版引擎等核心組件,但是沒有和用戶交互的界面瀏覽器。
 官網(wǎng)
 http://phantomjs.org/
 Casper下載地址:
 http://casperjs.org/
PhantomJS是可以運(yùn)行js腳本,下面有個(gè)例子
 
 訪問瀏覽器對(duì)象
 
 phantomjs的webpage模塊
將example中的hello改成上面的代碼,在cmd中 運(yùn)行js腳本
 
需要保存頁面圖片的話 在function內(nèi)加render函數(shù) 具體代碼如下
 `
 var webPage = require(‘webpage’);
 // 創(chuàng)建對(duì)象
 var page = webPage.create();
 page.open(
 ‘http://www.huanqiu.com/’,
 function(status) {
 console.log(‘請(qǐng)求響應(yīng)狀態(tài)碼’,status);
 page.render(
 ‘huanqiu.png’,
 {
 format: ‘png’,
 quality: 100
 });
 phantom.exit();
 }
 );
page.onLoadStarted = function () {
 console.log(‘頁面加載完畢’);
 }`
Selenium
Selenium是一個(gè)自動(dòng)化測(cè)試的工具。它可以直接運(yùn)行在瀏覽器中,支持主流的瀏覽器,包括PhantomJS
 在pycharm中 pip install 即可安裝
 下面我們來看看如何使用
處理異步請(qǐng)求
bing的查詢結(jié)果是通過異步請(qǐng)求返回結(jié)果,多以,直接訪問頁面不能直接獲取搜索結(jié)果
from selenium.webdriver import PhantomJS from selenium.webdriver.phantomjs.webdriver import WebDriverdriver = PhantomJS('E:/phantomjs/bin/phantomjs.exe') driver.set_window_size(1280,1080) driver.get('https://cn.bing.com/search?q=%E5%89%91%E6%9D%A5&qs=n&form=QBLH&sp=-1&pq=jianl&sc=8-5&sk=&cvid=8E8155699B16437BA16D9788700EABAC') driver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/test1.png')
 由于異步請(qǐng)求 加載需要時(shí)間 這里我們延遲三秒在保存圖片
 代碼同上 在保存圖片前加time.sleep(3)
 
模擬鍵盤操作
這里我們模擬百度關(guān)鍵字搜索
from selenium.webdriver.chrome.options import Options from selenium.webdriver import PhantomJS import time options = Options() options.headless = False driver = PhantomJS('E:/phantomjs/bin/phantomjs.exe') driver.set_window_size(1280,1080) #有的瀏覽器是你拉取多大 顯示多少內(nèi)容 所以盡量設(shè)置大一點(diǎn) driver.get('https://www.baidu.com') try:input= driver.find_element_by_id('kw')input.send_keys('zzh')submit = driver.find_element_by_id('su')submit.click() except:raise Exceptiondriver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/test3.png')下拉框和上面操作差不多 f12找到下拉框的位置 然后用xpath定位 用Select保存元素操作
 元素的值只有兩種find方式 一個(gè)通過index 一個(gè)通過value
頁面等待
越來越多的頁面采用AJAX這樣的異步技術(shù),這導(dǎo)致頁面代碼中要訪問的元素,沒有被加載就被訪問了,拋出異常
 解決方法一:
 上面使用的線程休眠,使用time.sleep來等待數(shù)據(jù)加載
 方法二:Selenium等待
 Selenium等待有兩種:顯示等待和隱式等待
顯示等待
指定一個(gè)條件,一直等到這個(gè)條件成立后繼續(xù)執(zhí)行,也可以設(shè)置超時(shí)時(shí)間,超時(shí)拋異常
 | expected_conditions | 說明 |
 | presence_of_element_located | 判斷某個(gè)元素是否被加載到DOM樹里,但不一定是可見的
 | visibility_of_element_located | 判斷元素是否可見 |
 | invisibility_of_element_located | 判斷某個(gè)元素沒被加載到DOM樹里或不可見的 |
 | element_to_be_clickable | 某個(gè)元素是否可見且可被點(diǎn)擊 |
 …
 打印type(e)是超時(shí)異常 ,并不是找不到
隱式等待
隱式等待等于加載了配置,所以訪問元素都等待特定的時(shí)間
from selenium.webdriver import PhantomJS from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as ECdriver = PhantomJS('E:/phantomjs/bin/phantomjs.exe') driver.set_window_size(1280,1080) #有的瀏覽器是你拉取多大 顯示多少內(nèi)容 所以盡量設(shè)置大一點(diǎn) driver.implicitly_wait(10) #隱式等待 driver.get('https://www.baidu.com') try:ele= driver.find_element_by_id('111') except Exception as e:print(e,type(e))finally:driver.quit()
 這里顯示沒找到異常
Phantomjs+Selenuim爬取淘寶
from selenium.webdriver import PhantomJS from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC import timedriver = PhantomJS('E:/phantomjs/bin/phantomjs.exe') driver.set_window_size(1280,1080) #有的瀏覽器是你拉取多大 顯示多少內(nèi)容 所以盡量設(shè)置大一點(diǎn) # driver.implicitly_wait(10) #隱式等待 driver.get('https://www.taobao.com') try:ele= driver.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]')print(type(ele))time.sleep(3)ele.click()time.sleep(3)username =driver.find_element_by_xpath('//*[@id="TPL_username_1"]')time.sleep(3)username.send_keys('17356526030')time.sleep(3)password = driver.find_element_by_xpath('//*[@id="TPL_password_1"]')password.send_keys('zzh807651901.')driver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/log.png')time.sleep(3)button = driver.find_element_by_xpath('//*[@id="J_SubmitStatic"]')time.sleep(3)button.click()time.sleep(3)driver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/PlantomJS2.png')except Exception as e:print(e,type(e))finally:driver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/PlantomJS3.png')driver.quit()總結(jié)
以上是生活随笔為你收集整理的PhantomJS+Selenium爬取淘宝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: IOS图标浅谈
- 下一篇: Zhong__Python lambda
