日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

PhantomJS+Selenium爬取淘宝

發(fā)布時間:2023/12/14 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PhantomJS+Selenium爬取淘宝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 動態(tài)網頁處理
  • PhantomJS
  • Selenium
    • 處理異步請求
    • 模擬鍵盤操作
    • 頁面等待
      • 顯示等待
      • 隱式等待
    • Phantomjs+Selenuim爬取淘寶

動態(tài)網頁處理

很多網站都采用AJAX技術,SPA技術,部分內容都是異步動態(tài)加載的。可以提高用戶體驗。
但是,對于爬蟲程序爬取到的HTML頁面相當于頁面模板,動態(tài)內容不再其中。
解決辦法之一,如果能構造一個包含JS引擎的瀏覽器,讓它加載網頁并和網站交互,我們編程從這個瀏覽器獲取內容包括動態(tài)內容。

PhantomJS

它是一個headless無頭瀏覽器,支持JavaScript。可以運行在windows、linux、mac os等。所謂的無頭瀏覽器就是包含JS引擎,瀏覽器排版引擎等核心組件,但是沒有和用戶交互的界面瀏覽器。
官網
http://phantomjs.org/
Casper下載地址:
http://casperjs.org/

PhantomJS是可以運行js腳本,下面有個例子



訪問瀏覽器對象

phantomjs的webpage模塊

// 加載模塊 var webPage = require('webpage'); // 創(chuàng)建對象 var page = webPage.create(); //打開頁面 // page.open( // 'https://www.baidu.com/', // function(status) { // console.log('請求響應狀態(tài)碼',status) // phantom.exit(); // } // ); //page.open('https://fanyi.baidu.com/sug','POST','kw=test',function(status) {console.log('請求響應狀態(tài)碼',status)console.log(page.content)phantom.exit();});

將example中的hello改成上面的代碼,在cmd中 運行js腳本

var webPage = require('webpage'); // 創(chuàng)建對象 var page = webPage.create(); page.open('http://www.huanqiu.com/',function (status) {console.log('evaluate:', status)result = page.evaluate(function (p1) {// console.log('測試參數:',p1); // 這個內部執(zhí)行,不輸出str_agent = window.navigator.userAgent; // 得到瀏覽器的user-agentstr_title = window.document.title; // 文檔標題 window可以省略// 下面訪問DOMvar node = document.querySelector('body > div.wrap > div.navTop > div > div > div.navTopOther > a.wxLogo');var dom_title = node.attributes['title'].valuereturn [p1, str_agent, str_title, dom_title];}, '參數1');console.log('處理結果', result)phantom.exit();}

需要保存頁面圖片的話 在function內加render函數 具體代碼如下
`
var webPage = require(‘webpage’);
// 創(chuàng)建對象
var page = webPage.create();
page.open(
‘http://www.huanqiu.com/’,
function(status) {
console.log(‘請求響應狀態(tài)碼’,status);
page.render(
‘huanqiu.png’,
{
format: ‘png’,
quality: 100
});
phantom.exit();
}
);

page.onLoadStarted = function () {
console.log(‘頁面加載完畢’);
}`

Selenium

Selenium是一個自動化測試的工具。它可以直接運行在瀏覽器中,支持主流的瀏覽器,包括PhantomJS
在pycharm中 pip install 即可安裝
下面我們來看看如何使用

from selenium.webdriver.chrome.options import Options from selenium.webdriver import PhantomJS from selenium.webdriver.phantomjs.webdriver import WebDriver from selenium.webdriver.common.by import By import time options = Options() options.headless = Falsedriver = PhantomJS('E:/phantomjs/bin/phantomjs.exe') driver.set_window_size(1280,1080) #有的瀏覽器是你拉取多大 顯示多少內容 所以盡量設置大一點 driver.get('https://login.taobao.com') driver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/test.png')

處理異步請求

bing的查詢結果是通過異步請求返回結果,多以,直接訪問頁面不能直接獲取搜索結果

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')


由于異步請求 加載需要時間 這里我們延遲三秒在保存圖片
代碼同上 在保存圖片前加time.sleep(3)

模擬鍵盤操作

這里我們模擬百度關鍵字搜索

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) #有的瀏覽器是你拉取多大 顯示多少內容 所以盡量設置大一點 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方式 一個通過index 一個通過value

頁面等待

越來越多的頁面采用AJAX這樣的異步技術,這導致頁面代碼中要訪問的元素,沒有被加載就被訪問了,拋出異常
解決方法一:
上面使用的線程休眠,使用time.sleep來等待數據加載
方法二:Selenium等待
Selenium等待有兩種:顯示等待和隱式等待

顯示等待

指定一個條件,一直等到這個條件成立后繼續(xù)執(zhí)行,也可以設置超時時間,超時拋異常
| expected_conditions | 說明 |
| presence_of_element_located | 判斷某個元素是否被加載到DOM樹里,但不一定是可見的
| visibility_of_element_located | 判斷元素是否可見 |
| invisibility_of_element_located | 判斷某個元素沒被加載到DOM樹里或不可見的 |
| element_to_be_clickable | 某個元素是否可見且可被點擊 |

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) #有的瀏覽器是你拉取多大 顯示多少內容 所以盡量設置大一點 driver.get('https://www.baidu.com') try:ele= WebDriverWait(driver,10).until(EC.presence_of_element_located #元素已加載到DOM,但不保證是可見的((By.ID,'111'))) except Exception as e:print(e)finally:driver.quit()


打印type(e)是超時異常 ,并不是找不到

隱式等待

隱式等待等于加載了配置,所以訪問元素都等待特定的時間

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) #有的瀏覽器是你拉取多大 顯示多少內容 所以盡量設置大一點 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) #有的瀏覽器是你拉取多大 顯示多少內容 所以盡量設置大一點 # 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()

總結

以上是生活随笔為你收集整理的PhantomJS+Selenium爬取淘宝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。