javascript
Selenium 与 PhantomJS
文章目錄
- 1、selenium介紹
- 2、selenium安裝
- 3.selenium常用操作
- 4.qq空間模擬登陸
- 5、百度圖片抓取
- 6、PhantomJS瀏覽器使用
- 7、圖片懶加載
1、selenium介紹
介紹:
1.selenium是一個(gè)web自動化測試用的框架. 程序員可以通過代碼實(shí)現(xiàn)對瀏覽器的控制, 比如打開網(wǎng)頁, 點(diǎn)擊網(wǎng)頁中的元素, 實(shí)現(xiàn)鼠標(biāo)滾動等操作.
2.它支持多款瀏覽器, 如谷歌瀏覽器, 火狐瀏覽器等等, 當(dāng)然也支持無頭瀏覽器.
目的:
在爬取數(shù)據(jù)的過程中, 經(jīng)常遇到動態(tài)數(shù)據(jù)加載, 一般動態(tài)數(shù)據(jù)加載有兩種, 一種通過ajax請求加載數(shù)據(jù), 另一種通過js代碼加載動態(tài)數(shù)據(jù). selenium可以模擬人操作真實(shí)瀏覽器, 獲取加載完成的頁面數(shù)據(jù)
ajax:
url有規(guī)律且未加密, 直接構(gòu)建url連接請求
url加密過無法破解規(guī)律 --> selenium
js動態(tài)數(shù)據(jù)加載 --> selenium三要素: 瀏覽器, 驅(qū)動程序, selenium框架
瀏覽器: 推薦谷歌瀏覽器, 標(biāo)準(zhǔn)穩(wěn)定版本
驅(qū)動程序:http://chromedriver.storage.googleapis.com/index.html
pip install selenium
2、selenium安裝
三要素: 瀏覽器, 驅(qū)動程序, selenium框架瀏覽器: 推薦谷歌瀏覽器, 標(biāo)準(zhǔn)穩(wěn)定版本驅(qū)動程序:http://chromedriver.storage.googleapis.com/index.htmlpip install selenium# 測試: from selenium import webdriver browser = webdriver.Chrome('./chromedriver.exe') # 將驅(qū)動放在腳本所在的文件夾 browser.get('https://www.baidu.com')3.selenium常用操作
# 實(shí)例化瀏覽器對象: from selenium import webdriver browser = webdriver.Chrome('driverpath')# 發(fā)送get請求: browser.get('https://www.baidu.com')# 獲取頁面元素: find_element_by_id:根據(jù)元素的id find_element_by_name:根據(jù)元素的name屬性 find_element_by_xpath:根據(jù)xpath表達(dá)式 find_element_by_class_name:根據(jù)class的值 find_element_by_css_selector:根據(jù)css選擇器# 節(jié)點(diǎn)交互操作: click(): 點(diǎn)擊 send_keys(): 輸入內(nèi)容 clear(): 清空操作 execute_script(js): 執(zhí)行指定的js代碼 # JS代碼: window.scrollTo(0, document.body.scrollHeight)可以模擬鼠標(biāo)滾動一屏高度 quit(): 退出瀏覽器# 獲取網(wǎng)頁的數(shù)據(jù): browser.page_source ---> str類型# frame switch_to.frame('frameid')4.qq空間模擬登陸
from selenium import webdriver import time # 實(shí)例化瀏覽器對象 browser = webdriver.Chrome('./chromedriver.exe') # 打開qq空間登陸頁面 browser.get('https://qzone.qq.com/') time.sleep(1) # 轉(zhuǎn)至frame子頁面 browser.switch_to.frame('login_frame') # 獲取密碼登陸選項(xiàng)并點(diǎn)擊 a_tag = browser.find_element_by_id('switcher_plogin') a_tag.click() time.sleep(1) # 獲取賬號輸入框并輸入賬號 browser.find_element_by_id('u').clear() user = browser.find_element_by_id('u') user.send_keys('3338003899') time.sleep(1) # 獲取密碼輸入框并輸入密碼 browser.find_element_by_id('p').clear() pwd = browser.find_element_by_id('p') pwd.send_keys('qq123456') time.sleep(1) # 獲取登陸按鈕并單擊 button = browser.find_element_by_id('login_button') button.click()5、百度圖片抓取
import time import requests from selenium import webdriver from bs4 import BeautifulSoup from urllib import request# 1.實(shí)例化瀏覽器對象 browser = webdriver.Chrome('./chromedriver.exe')# 2.向服務(wù)器發(fā)起請求 browser.get('http://image.baidu.com/') time.sleep(2)# 3.輸入關(guān)鍵字 input_tag = browser.find_element_by_id('kw') input_tag.send_keys('腰子姐') time.sleep(2)# 4.點(diǎn)擊搜索 button = browser.find_element_by_class_name('s_search') button.click() time.sleep(2)# 5.實(shí)現(xiàn)滾動下拉 for i in range(3):browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')time.sleep(3)text = browser.page_source# 6.實(shí)現(xiàn)數(shù)據(jù)解析 soup = BeautifulSoup(text, 'lxml')li_list = soup.select('.imgpage ul li')headers = {"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' }for li in li_list:href = li['data-objurl']# print(href)# request.urlretrieve(href, '%s.jpg'%li_list.index(li))res = requests.get(url=href, headers=headers)# res.text: 文本數(shù)據(jù)# res.json(): json數(shù)據(jù)# res.content: 二進(jìn)制流with open('%s.jpg'%li_list.index(li), 'wb') as f:f.write(res.content)browser.quit()6、PhantomJS瀏覽器使用
# PhantomJS下載及配置環(huán)境變量- 下載, 直接解壓- 將解壓文件的bin目錄添加至環(huán)境變量# PhantomJS無界面瀏覽器 from selenium import webdriver browser = webdriver.PhantomJS() browser.get('https://www.baidu.com') with open('baidu_phantomjs.html', 'w', encoding="utf-8") as f:f.write(browser.page_source) # 谷歌無頭瀏覽器 from selenium import webdriver from selenium.webdriver.chrome.options import Optionschrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') browser = webdriver.Chrome(chrome_options=chrome_options) browser.get("https://www.baidu.com") print(browser.page_source) with open('baidu_headerless.html', 'w', encoding='utf-8') as f:f.write(browser.page_source)7、圖片懶加載
import requests from lxml import etree from urllib import request import urllib url = 'http://sc.chinaz.com/tupian/index.html' headers = {"USer-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' } res = requests.get(url=url, headers=headers) res.encoding = 'utf-8' # print(res.text) tree = etree.HTML(res.text)src_list = tree.xpath('//div[contains(@class,"box")]/div/a/img/@src2') for url_img in src_list:request.urlretrieve(url_img,'%s.jpg'%src_list.index(url_img)) from selenium import webdriver import timebrowser = webdriver.Chrome('./chromedriver.exe') browser.get('http://image.baidu.com/') search = browser.find_element_by_id('kw') search.send_keys('安琪拉') button = browser.find_element_by_class_name('s_search') button.click() for i in range(3):browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')time.sleep(5)text = browser.page_source with open('baidu_pic.html', 'w', encoding="utf-8") as f:f.write(text)from bs4 import BeautifulSoupsoup = BeautifulSoup(open('./baidu_pic.html', 'r', encoding='utf-8'), 'lxml') li_list = soup.select('.imgpage ul li') for url_img in li_list:url_img = url_img['data-objurl']print(url_img)總結(jié)
以上是生活随笔為你收集整理的Selenium 与 PhantomJS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BeautifulSoup库使用
- 下一篇: JavaScript流程控制之分支结构