您好,登錄后才能下訂單哦!
一.什么是圖片懶加載?
- 案例分析:抓取站長(zhǎng)素材http://sc.chinaz.com/中的圖片數(shù)據(jù)
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #獲取頁(yè)面文本數(shù)據(jù) response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析頁(yè)面數(shù)據(jù)(獲取頁(yè)面中的圖片鏈接) #創(chuàng)建etree對(duì)象 tree = etree.HTML(page_text) div_list = tree.xpath('//div[@id="container"]/div') #解析獲取圖片地址和圖片的名稱 for div in div_list: image_url = div.xpath('.//img/@src') image_name = div.xpath('.//img/@alt') print(image_url) #打印圖片鏈接 print(image_name)#打印圖片名稱
運(yùn)行結(jié)果觀察發(fā)現(xiàn),我們可以獲取圖片的名稱,但是鏈接獲取的為空,檢查后發(fā)現(xiàn)xpath表達(dá)式也沒(méi)有問(wèn)題,究其原因出在了哪里呢?
- 圖片懶加載概念:
圖片懶加載是一種網(wǎng)頁(yè)優(yōu)化技術(shù)。圖片作為一種網(wǎng)絡(luò)資源,在被請(qǐng)求時(shí)也與普通靜態(tài)資源一樣,將占用網(wǎng)絡(luò)資源,而一次性將整個(gè)頁(yè)面的所有圖片加載完,將大大增加頁(yè)面的首屏加載時(shí)間。為了解決這種問(wèn)題,通過(guò)前后端配合,使圖片僅在瀏覽器當(dāng)前視窗內(nèi)出現(xiàn)時(shí)才加載該圖片,達(dá)到減少首屏圖片請(qǐng)求數(shù)的技術(shù)就被稱為“圖片懶加載”。
- 網(wǎng)站一般如何實(shí)現(xiàn)圖片懶加載技術(shù)呢?
在網(wǎng)頁(yè)源碼中,在img標(biāo)簽中首先會(huì)使用一個(gè)“偽屬性”(通常使用src2,original......)去存放真正的圖片鏈接而并非是直接存放在src屬性中。當(dāng)圖片出現(xiàn)到頁(yè)面的可視化區(qū)域中,會(huì)動(dòng)態(tài)將偽屬性替換成src屬性,完成圖片的加載。
- 站長(zhǎng)素材案例后續(xù)分析:通過(guò)細(xì)致觀察頁(yè)面的結(jié)構(gòu)后發(fā)現(xiàn),網(wǎng)頁(yè)中圖片的鏈接是存儲(chǔ)在了src2這個(gè)偽屬性中
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #獲取頁(yè)面文本數(shù)據(jù) response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析頁(yè)面數(shù)據(jù)(獲取頁(yè)面中的圖片鏈接) #創(chuàng)建etree對(duì)象 tree = etree.HTML(page_text) div_list = tree.xpath('//div[@id="container"]/div') #解析獲取圖片地址和圖片的名稱 for div in div_list: image_url = div.xpath('.//img/@src'2) #src2偽屬性 image_name = div.xpath('.//img/@alt') print(image_url) #打印圖片鏈接 print(image_name)#打印圖片名稱
二.selenium
- 什么是selenium?
是Python的一個(gè)第三方庫(kù),對(duì)外提供的接口可以操作瀏覽器,然后讓瀏覽器完成自動(dòng)化的操作?! ?/p>
- 環(huán)境搭建
1.安裝selenum:pip install selenium
2.獲取某一款瀏覽器的驅(qū)動(dòng)程序(以谷歌瀏覽器為例)
2.1 谷歌瀏覽器驅(qū)動(dòng)下載地址
2.2 下載的驅(qū)動(dòng)程序必須和瀏覽器的版本統(tǒng)一
大家可以根據(jù)http://blog.csdn.net/huilan_same/article/details/51896672中提供的版本映射表進(jìn)行對(duì)應(yīng)
- 效果展示:大家可以將如下代碼運(yùn)行,觀看效果
from selenium import webdriver from time import sleep # 后面是你的瀏覽器驅(qū)動(dòng)位置,記得前面加r'','r'是防止字符轉(zhuǎn)義的 driver = webdriver.Chrome(r'驅(qū)動(dòng)程序路徑') # 用get打開(kāi)百度頁(yè)面 driver.get("http://www.baidu.com") # 查找頁(yè)面的“設(shè)置”選項(xiàng),并進(jìn)行點(diǎn)擊 driver.find_elements_by_link_text('設(shè)置')[0].click() sleep(2) # # 打開(kāi)設(shè)置后找到“搜索設(shè)置”選項(xiàng),設(shè)置為每頁(yè)顯示50條 driver.find_elements_by_link_text('搜索設(shè)置')[0].click() sleep(2) # 選中每頁(yè)顯示50條 m = driver.find_element_by_id('nr') sleep(2) m.find_element_by_xpath('//*[@id="nr"]/option[3]').click() m.find_element_by_xpath('.//option[3]').click() sleep(2) # 點(diǎn)擊保存設(shè)置 driver.find_elements_by_class_name("prefpanelgo")[0].click() sleep(2) # 處理彈出的警告頁(yè)面 確定accept() 和 取消dismiss() driver.switch_to_alert().accept() sleep(2) # 找到百度的輸入框,并輸入 美女 driver.find_element_by_id('kw').send_keys('美女') sleep(2) # 點(diǎn)擊搜索按鈕 driver.find_element_by_id('su').click() sleep(2) # 在打開(kāi)的頁(yè)面中找到“Selenium - 開(kāi)源中國(guó)社區(qū)”,并打開(kāi)這個(gè)頁(yè)面 driver.find_elements_by_link_text('美女_百度圖片')[0].click() sleep(3) # 關(guān)閉瀏覽器 driver.quit()
- 代碼操作:
#導(dǎo)包 from selenium import webdriver #創(chuàng)建瀏覽器對(duì)象,通過(guò)該對(duì)象可以操作瀏覽器 browser = webdriver.Chrome('驅(qū)動(dòng)路徑') #使用瀏覽器發(fā)起指定請(qǐng)求 browser.get(url) #使用下面的方法,查找指定的元素進(jìn)行操作即可 find_element_by_id 根據(jù)id找節(jié)點(diǎn) find_elements_by_name 根據(jù)name找 find_elements_by_xpath 根據(jù)xpath查找 find_elements_by_tag_name 根據(jù)標(biāo)簽名找 find_elements_by_class_name 根據(jù)class名字查找
三.PhantomJS
PhantomJS是一款無(wú)界面的瀏覽器,其自動(dòng)化操作流程和上述操作谷歌瀏覽器是一致的。由于是無(wú)界面的,為了能夠展示自動(dòng)化操作流程,PhantomJS為用戶提供了一個(gè)截屏的功能,使用save_screenshot函數(shù)實(shí)現(xiàn)。
-案例:
from selenium import webdriver import time # phantomjs路徑 path = r'PhantomJS驅(qū)動(dòng)路徑' browser = webdriver.PhantomJS(path) # 打開(kāi)百度 url = 'https://cache.yisu.com/upload/information/20200622/113/23198.html') # 查找input輸入框 my_input = browser.find_element_by_id('kw') # 往框里面寫文字 my_input.send_keys('美女') time.sleep(3) #截屏 browser.save_screenshot(r'phantomjs\meinv.png') # 查找搜索按鈕 button = browser.find_elements_by_class_name('s_btn')[0] button.click() time.sleep(3) browser.save_screenshot(r'phantomjs\show.png') time.sleep(3) browser.quit()
【重點(diǎn)】selenium+phantomjs 就是爬蟲終極解決方案:有些網(wǎng)站上的內(nèi)容信息是通過(guò)動(dòng)態(tài)加載js形成的,所以使用普通爬蟲程序無(wú)法回去動(dòng)態(tài)加載的js內(nèi)容。例如豆瓣電影中的電影信息是通過(guò)下拉操作動(dòng)態(tài)加載更多的電影信息。
綜合操作:
- 需求:盡可能多的爬取豆瓣網(wǎng)中的電影信息
from selenium import webdriver from time import sleep import time if __name__ == '__main__': url = 'https://movie.douban.com/typerank?type_name=%E6%81%90%E6%80%96&type=20&interval_id=100:90&action=' # 發(fā)起請(qǐng)求前,可以讓url表示的頁(yè)面動(dòng)態(tài)加載出更多的數(shù)據(jù) path = r'C:\Users\Administrator\Desktop\爬蟲授課\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe' # 創(chuàng)建無(wú)界面的瀏覽器對(duì)象 bro = webdriver.PhantomJS(path) # 發(fā)起url請(qǐng)求 bro.get(url) time.sleep(3) # 截圖 bro.save_screenshot('1.png') # 執(zhí)行js代碼(讓滾動(dòng)條向下偏移n個(gè)像素(作用:動(dòng)態(tài)加載了更多的電影信息)) js = 'document.body.scrollTop=2000' bro.execute_script(js) # 該函數(shù)可以執(zhí)行一組字符串形式的js代碼 time.sleep(4) bro.save_screenshot('2.png') time.sleep(2) # 使用爬蟲程序爬去當(dāng)前url中的內(nèi)容 html_source = bro.page_source # 該屬性可以獲取當(dāng)前瀏覽器的當(dāng)前頁(yè)的源碼(html) with open('./source.html', 'w', encoding='utf-8') as fp: fp.write(html_source) bro.quit()
四.谷歌無(wú)頭瀏覽器
由于PhantomJs最近已經(jīng)停止了更新和維護(hù),所以推薦大家可以使用谷歌的無(wú)頭瀏覽器,是一款無(wú)界面的谷歌瀏覽器。
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time # 創(chuàng)建一個(gè)參數(shù)對(duì)象,用來(lái)控制chrome以無(wú)界面模式打開(kāi) chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') # 驅(qū)動(dòng)路徑 path = r'C:\Users\ZBLi\Desktop\1801\day05\ziliao\chromedriver.exe' # 創(chuàng)建瀏覽器對(duì)象 browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options) # 上網(wǎng) url = 'https://cache.yisu.com/upload/information/20200622/113/23199.html') browser.quit()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。