1、圖片懶加載html
圖片懶加載概念:web
圖片懶加載是一種網頁優化技術。圖片做爲一種網絡資源,在被請求時也與普通靜態資源同樣,將佔用網絡資源,而一次性將整個頁面的全部圖片加載完,將大大增長頁面的首屏加載時間。爲了解決這種問題,經過先後端配合,使圖片僅在瀏覽器當前視窗內出現時才加載該圖片,達到減小首屏圖片請求數的技術就被稱爲「圖片懶加載」。chrome
網站通常如何實現圖片懶加載技術呢?windows
在網頁源碼中,在img標籤中首先會使用一個「僞屬性」(一般使用src2,original......)去存放真正的圖片連接而並不是是直接存放在src屬性中。當圖片出現到頁面的可視化區域中,會動態將僞屬性替換成src屬性,完成圖片的加載。後端
二.seleniumapi
什麼是selenium? 是Python的一個第三方庫,對外提供的接口能夠操做瀏覽器,而後讓瀏覽器完成自動化的操做。 環境搭建 安裝selenum:pip install selenium 獲取某一款瀏覽器的驅動程序(以谷歌瀏覽器爲例) 谷歌瀏覽器驅動下載地址:http://chromedriver.storage.googleapis.com/index.html 下載的驅動程序必須和瀏覽器的版本統一,你們能夠根據http://blog.csdn.net/huilan_same/article/details/51896672中提供的版本映射表進行對應
#導包 from selenium import webdriver #建立瀏覽器對象,經過該對象能夠操做瀏覽器 browser = webdriver.Chrome('驅動路徑') #使用瀏覽器發起指定請求 browser.get(url) #使用下面的方法,查找指定的元素進行操做便可 find_element_by_id 根據id找節點 find_elements_by_name 根據name找 find_elements_by_xpath 根據xpath查找 find_elements_by_tag_name 根據標籤名找 find_elements_by_class_name 根據class名字查找
from selenium import webdriver import time #1.建立一個瀏覽器對象 bro = webdriver.Chrome(executable_path=r"C:\Users\Administrator\Desktop\爬蟲02\chromedriver.exe") #2.打開瀏覽器 url = 'https://www.baidu.com/' bro.get(url=url) time.sleep(3) #3.調用seleniem提供的接口 #找到了指定搜索框 myInput = bro.find_element_by_id("kw") #在對應的搜索框中錄入指定的詞條 myInput.send_keys("人民幣") time.sleep(5) #定位到搜索按鈕 myButton = bro.find_element_by_id('su') myButton.click() time.sleep(5) #關閉瀏覽器 bro.quit()
三.phantomJs瀏覽器
from selenium import webdriver import time # 1.建立一個瀏覽器對象 # bro = webdriver.Chrome(executable_path=r"C:\Users\Administrator\Desktop\爬蟲02\chromedriver.exe") bro = webdriver.PhantomJS(executable_path=r"F:\Python自動化21期\3.Django&項目\phantomjs-2.1.1-windows\bin\phantomjs.exe") # 2.打開瀏覽器 url = 'https://www.baidu.com/' bro.get(url=url) time.sleep(3) # 截圖 bro.save_screenshot('./1.png') # 3.調用seleniem提供的接口 # 找到了指定搜索框 myInput = bro.find_element_by_id("kw") # 在對應的搜索框中錄入指定的詞條 myInput.send_keys("人民幣") time.sleep(5) bro.save_screenshot('./2.png') # 定位到搜索按鈕 myButton = bro.find_element_by_id('su') myButton.click() time.sleep(5) bro.save_screenshot('./3.png') # 關閉瀏覽器 bro.quit()
重點:selenium+phantomjs 就是爬蟲終極解決方案:有些網站上的內容信息是經過動態加載js造成的,因此使用普通爬蟲程序沒法回去動態加載的js內容。例如豆瓣電影中的電影信息是經過下拉操做動態加載更多的電影信息。網絡
綜合操做:需求是儘量多的爬取豆瓣網中的電影信息less
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=' # 發起請求前,可讓url表示的頁面動態加載出更多的數據 path = r'C:\Users\Administrator\Desktop\爬蟲授課\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe' # 建立無界面的瀏覽器對象 bro = webdriver.PhantomJS(path) # 發起url請求 bro.get(url) time.sleep(3) # 截圖 bro.save_screenshot('1.png') # 執行js代碼(讓滾動條向下偏移n個像素(做用:動態加載了更多的電影信息)) js = 'window.scrollTo(0,document.body.scrollHeight)' bro.execute_script(js) # 該函數能夠執行一組字符串形式的js代碼 time.sleep(2) bro.execute_script(js) # 該函數能夠執行一組字符串形式的js代碼 time.sleep(2) bro.save_screenshot('2.png') time.sleep(2) # 使用爬蟲程序爬去當前url中的內容 html_source = bro.page_source # 該屬性能夠獲取當前瀏覽器的當前頁的源碼(html) with open('./source.html', 'w', encoding='utf-8') as fp: fp.write(html_source) bro.quit()
#需求:梨視頻中爬取更多的視頻數據(動態加載)
#需求:爬取更多的視頻數據(動態加載) import requests from selenium import webdriver from lxml import etree import re #1.建立一個無頭瀏覽器 bro = webdriver.PhantomJS(executable_path=r"F:\Python自動化21期\3.Django&項目\phantomjs-2.1.1-windows\bin\phantomjs.exe") #2.根據指定的url打開瀏覽器 bro.get(url="http://www.pearvideo.com/category_6") #3.滾輪向下拖動,加載出更多的視頻數據(執行js代碼) js = "window.scrollTo(0,document.body.scrollHeight)" bro.execute_script(js) #讓瀏覽器執行一組js代碼 #4.獲取頁面源碼數據,進行解析操做 page_text = bro.page_source#該屬性能夠得到當前瀏覽器對應的頁面數據 #使用xpath進行解析操做 tree = etree.HTML(page_text) li_list = tree.xpath('//li[@class="categoryem"]') headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' } for li in li_list: secondPage_url = "http://www.pearvideo.com/"+li.xpath('./div/a/@href')[0]#./div 點表示定位到當前,必定要加 #對上述url發起請求,獲取二級頁面的頁面數據 page_text = requests.get(url=secondPage_url,headers=headers).text#獲取的圖片路徑 video_url = re.findall('srcUrl="(.*?)",',page_text,re.S)[0] #S將整個頁面源碼當作一個字符串,正則做用於一整個大字符串! srcUrl中內容是想要數據,能夠加一個括號進行分組! videoData = requests.get(url=video_url,headers=headers).content fileName = video_url.split('/')[-1] with open(fileName,'wb') as fp: fp.write(videoData) print(fileName+'已經被下載完畢')
四.谷歌無頭瀏覽器ide
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time # 建立一個參數對象,用來控制chrome以無界面模式打開 chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') # 驅動路徑 path = r'F:\selenium週末精品班\安裝包\chromedriver.exe' # 建立瀏覽器對象 browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options) # 上網 url = 'http://www.baidu.com/' browser.get(url) time.sleep(3) browser.save_screenshot('baidu.png') browser.quit()
圖片懶加載-倒數第四行多了一個'圖片懶加載--本身練習!src2小結:selenium中注意page_source屬性 #獲取頁面源碼數據,進行解析操做 page_text = bro.page_source#該屬性能夠得到當前瀏覽器對應的頁面數據# 建立無頭的谷歌瀏覽器對象 browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)