亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python爬蟲圖片懶加載技術(shù) selenium和PhantomJS解析

 更新時(shí)間:2019年09月18日 10:28:47   作者:Roc_Atlantis  
這篇文章主要介紹了Python爬蟲圖片懶加載技術(shù) selenium和PhantomJS解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一.什么是圖片懶加載?

- 案例分析:抓取站長(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',
   }
   #獲取頁面文本數(shù)據(jù)
   response = requests.get(url=url,headers=headers)
   response.encoding = 'utf-8'
   page_text = response.text
   #解析頁面數(shù)據(jù)(獲取頁面中的圖片鏈接)
   #創(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á)式也沒有問題,究其原因出在了哪里呢?

- 圖片懶加載概念:

圖片懶加載是一種網(wǎng)頁優(yōu)化技術(shù)。圖片作為一種網(wǎng)絡(luò)資源,在被請(qǐng)求時(shí)也與普通靜態(tài)資源一樣,將占用網(wǎng)絡(luò)資源,而一次性將整個(gè)頁面的所有圖片加載完,將大大增加頁面的首屏加載時(shí)間。為了解決這種問題,通過前后端配合,使圖片僅在瀏覽器當(dāng)前視窗內(nèi)出現(xiàn)時(shí)才加載該圖片,達(dá)到減少首屏圖片請(qǐng)求數(shù)的技術(shù)就被稱為“圖片懶加載”。

- 網(wǎng)站一般如何實(shí)現(xiàn)圖片懶加載技術(shù)呢?

在網(wǎng)頁源碼中,在img標(biāo)簽中首先會(huì)使用一個(gè)“偽屬性”(通常使用src2,original......)去存放真正的圖片鏈接而并非是直接存放在src屬性中。當(dāng)圖片出現(xiàn)到頁面的可視化區(qū)域中,會(huì)動(dòng)態(tài)將偽屬性替換成src屬性,完成圖片的加載。

- 站長(zhǎng)素材案例后續(xù)分析:通過細(xì)致觀察頁面的結(jié)構(gòu)后發(fā)現(xiàn),網(wǎng)頁中圖片的鏈接是存儲(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',
   }
   #獲取頁面文本數(shù)據(jù)
   response = requests.get(url=url,headers=headers)
   response.encoding = 'utf-8'
   page_text = response.text
   #解析頁面數(shù)據(jù)(獲取頁面中的圖片鏈接)
   #創(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打開百度頁面
driver.get("http://www.baidu.com")
# 查找頁面的“設(shè)置”選項(xiàng),并進(jìn)行點(diǎn)擊
driver.find_elements_by_link_text('設(shè)置')[0].click()
sleep(2)
# # 打開設(shè)置后找到“搜索設(shè)置”選項(xiàng),設(shè)置為每頁顯示50條
driver.find_elements_by_link_text('搜索設(shè)置')[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)

# 點(diǎn)擊保存設(shè)置
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)
# 點(diǎn)擊搜索按鈕
driver.find_element_by_id('su').click()
sleep(2)
# 在打開的頁面中找到“Selenium - 開源中國(guó)社區(qū)”,并打開這個(gè)頁面
driver.find_elements_by_link_text('美女_百度圖片')[0].click()
sleep(3)
# 關(guān)閉瀏覽器
driver.quit()

- 代碼操作:

#導(dǎo)包
from selenium import webdriver 
#創(chuàng)建瀏覽器對(duì)象,通過該對(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是一款無界面的瀏覽器,其自動(dòng)化操作流程和上述操作谷歌瀏覽器是一致的。由于是無界面的,為了能夠展示自動(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)
# 打開百度
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()

【重點(diǎn)】selenium+phantomjs 就是爬蟲終極解決方案:有些網(wǎng)站上的內(nèi)容信息是通過動(dòng)態(tài)加載js形成的,所以使用普通爬蟲程序無法回去動(dòng)態(tài)加載的js內(nèi)容。例如豆瓣電影中的電影信息是通過下拉操作動(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表示的頁面動(dòng)態(tài)加載出更多的數(shù)據(jù)
  path = r'C:\Users\Administrator\Desktop\爬蟲授課\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe'
  # 創(chuàng)建無界面的瀏覽器對(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)前頁的源碼(html)
  with open('./source.html', 'w', encoding='utf-8') as fp:
    fp.write(html_source)
  bro.quit()

四.谷歌無頭瀏覽器

由于PhantomJs最近已經(jīng)停止了更新和維護(hù),所以推薦大家可以使用谷歌的無頭瀏覽器,是一款無界面的谷歌瀏覽器。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
# 創(chuàng)建一個(gè)參數(shù)對(duì)象,用來控制chrome以無界面模式打開
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 = 'http://www.baidu.com/'
browser.get(url)
time.sleep(3)
browser.save_screenshot('baidu.png')
browser.quit()

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談Python 對(duì)象內(nèi)存占用

    淺談Python 對(duì)象內(nèi)存占用

    下面小編就為大家?guī)硪黄獪\談Python 對(duì)象內(nèi)存占用。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • 在python中使用[[v]*n]*n遇到的坑及解決

    在python中使用[[v]*n]*n遇到的坑及解決

    這篇文章主要介紹了在python中使用[[v]*n]*n遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Kotlin 中的 apply 函數(shù)用法詳解

    Kotlin 中的 apply 函數(shù)用法詳解

    apply 函數(shù)是 Kotlin 中一個(gè)十分方便的工具,它使得對(duì)對(duì)象進(jìn)行初始化和配置變得更加簡(jiǎn)潔、清晰,通過與 Java 的對(duì)比,我們可以看出 Kotlin 在處理類似情況時(shí)具有更高的表現(xiàn)力和簡(jiǎn)潔性,本文給大家介紹Kotlin apply 函數(shù)的用法,感興趣的朋友一起看看吧
    2024-03-03
  • python實(shí)現(xiàn)TCP服務(wù)器端與客戶端的方法詳解

    python實(shí)現(xiàn)TCP服務(wù)器端與客戶端的方法詳解

    這篇文章主要介紹了python實(shí)現(xiàn)TCP服務(wù)器端與客戶端的方法,以實(shí)例形式詳解分析了Python實(shí)現(xiàn)服務(wù)器端與客戶端的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • python+mysql實(shí)現(xiàn)教務(wù)管理系統(tǒng)

    python+mysql實(shí)現(xiàn)教務(wù)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python+mysql實(shí)現(xiàn)教務(wù)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Python爬取網(wǎng)站圖片并保存的實(shí)現(xiàn)示例

    Python爬取網(wǎng)站圖片并保存的實(shí)現(xiàn)示例

    這篇文章主要介紹了Python爬取網(wǎng)站圖片并保存的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python自動(dòng)化測(cè)試之異常處理機(jī)制實(shí)例詳解

    Python自動(dòng)化測(cè)試之異常處理機(jī)制實(shí)例詳解

    為了保持自動(dòng)化測(cè)試用例的健壯性,異常的捕獲及處理,日志的記錄對(duì)掌握自動(dòng)化測(cè)試執(zhí)行情況尤為重要,下面這篇文章主要給大家介紹了關(guān)于Python自動(dòng)化測(cè)試之異常處理機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • python3實(shí)現(xiàn)斐波那契數(shù)列(4種方法)

    python3實(shí)現(xiàn)斐波那契數(shù)列(4種方法)

    這篇文章主要介紹了python3實(shí)現(xiàn)斐波那契數(shù)列(4種方法),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python政策網(wǎng)字體反爬實(shí)例(附完整代碼)

    python政策網(wǎng)字體反爬實(shí)例(附完整代碼)

    大家好,本篇文章主要講的是python政策網(wǎng)字體反爬實(shí)例(附完整代碼),感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Mac下python包管理工具pip的安裝

    Mac下python包管理工具pip的安裝

    這篇文章介紹了Mac下python包管理工具pip的安裝方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評(píng)論