javascript
Python网络爬虫之图片懒加载技术、selenium和PhantomJS
引入
今日概要
- 圖片懶加載
- selenium
- phantomJs
- 谷歌無頭瀏覽器
知識點回顧
- 驗證碼處理流程
今日詳情
動態數據加載處理
一.圖片懶加載
- 什么是圖片懶加載?
- 案例分析:抓取站長素材http://sc.chinaz.com/中的圖片數據 #!/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', } #獲取頁面文本數據 response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析頁面數據(獲取頁面中的圖片鏈接) #創建etree對象 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)#打印圖片名稱
?
-
- 運行結果觀察發現,我們可以獲取圖片的名稱,但是鏈接獲取的為空,檢查后發現xpath表達式也沒有問題,究其原因出在了哪里呢?
-
圖片懶加載概念:
-
圖片懶加載是一種網頁優化技術。圖片作為一種網絡資源,在被請求時也與普通靜態資源一樣,將占用網絡資源,而一次性將整個頁面的所有圖片加載完,將大大增加頁面的首屏加載時間。為了解決這種問題,通過前后端配合,使圖片僅在瀏覽器當前視窗內出現時才加載該圖片,達到減少首屏圖片請求數的技術就被稱為“圖片懶加載”。
-
-
網站一般如何實現圖片懶加載技術呢?
-
在網頁源碼中,在img標簽中首先會使用一個“偽屬性”(通常使用src2,original......)去存放真正的圖片鏈接而并非是直接存放在src屬性中。當圖片出現到頁面的可視化區域中,會動態將偽屬性替換成src屬性,完成圖片的加載。
-
-
站長素材案例后續分析:通過細致觀察頁面的結構后發現,網頁中圖片的鏈接是存儲在了src2這個偽屬性中
#!/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', } #獲取頁面文本數據 response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析頁面數據(獲取頁面中的圖片鏈接) #創建etree對象 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)#打印圖片名稱?
- 案例分析:抓取站長素材http://sc.chinaz.com/中的圖片數據 #!/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', } #獲取頁面文本數據 response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析頁面數據(獲取頁面中的圖片鏈接) #創建etree對象 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)#打印圖片名稱
二.selenium
- 什么是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 from time import sleep# 后面是你的瀏覽器驅動位置,記得前面加r'','r'是防止字符轉義的 driver = webdriver.Chrome(r'驅動程序路徑') # 用get打開百度頁面 driver.get("http://www.baidu.com") # 查找頁面的“設置”選項,并進行點擊 driver.find_elements_by_link_text('設置')[0].click() sleep(2) # # 打開設置后找到“搜索設置”選項,設置為每頁顯示50條 driver.find_elements_by_link_text('搜索設置')[0].click() sleep(2) # 選中每頁顯示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) # 點擊保存設置 driver.find_elements_by_class_name("prefpanelgo")[0].click() sleep(2) # 處理彈出的警告頁面 確定accept() 和 取消dismiss() driver.switch_to_alert().accept() sleep(2) # 找到百度的輸入框,并輸入 美女 driver.find_element_by_id('kw').send_keys('美女') sleep(2) # 點擊搜索按鈕 driver.find_element_by_id('su').click() sleep(2) # 在打開的頁面中找到“Selenium - 開源中國社區”,并打開這個頁面 driver.find_elements_by_link_text('美女_百度圖片')[0].click() sleep(3) # 關閉瀏覽器 driver.quit()代碼介紹:
#導包 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名字查找?
?
三.phantomJs
- PhantomJS是一款無界面的瀏覽器,其自動化操作流程和上述操作谷歌瀏覽器是一致的。由于是無界面的,為了能夠展示自動化操作流程,PhantomJS為用戶提供了一個截屏的功能,使用save_screenshot函數實現。
- 代碼演示: from selenium import webdriver
import time# phantomjs路徑
path = r'PhantomJS驅動路徑'
browser = webdriver.PhantomJS(path)# 打開百度
url = 'http://www.baidu.com/'
browser.get(url)time.sleep(3)browser.save_screenshot(r'phantomjs\baidu.png')# 查找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()
?
-
重點:selenium+phantomjs 就是爬蟲終極解決方案:有些網站上的內容信息是通過動態加載js形成的,所以使用普通爬蟲程序無法回去動態加載的js內容。例如豆瓣電影中的電影信息是通過下拉操作動態加載更多的電影信息。
-
綜合操作:需求是盡可能多的爬取豆瓣網中的電影信息
from selenium import webdriver from time import sleep import timeif __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()?
-
四.谷歌無頭瀏覽器
- 由于PhantomJs最近已經停止了更新和維護,所以推薦大家可以使用谷歌的無頭瀏覽器,是一款無界面的谷歌瀏覽器。
- 代碼展示: 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'C:\Users\ZBLi\Desktop\1801\day05\ziliao\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()
作業
- 爬取網易新聞國內板塊下的新聞標題和新聞內容
轉載于:https://www.cnblogs.com/presleyren/p/10579705.html
總結
以上是生活随笔為你收集整理的Python网络爬虫之图片懒加载技术、selenium和PhantomJS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据技术原理与应用(一):大数据概述
- 下一篇: 框架学习 Spring之依赖注入DI