亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python爬蟲圖片懶加載技術 selenium和PhantomJS解析

系統 1535 0

一.什么是圖片懶加載?

- 案例分析:抓取站長素材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)#打印圖片名稱
          

二.selenium

- 什么是selenium?

是Python的一個第三方庫,對外提供的接口可以操作瀏覽器,然后讓瀏覽器完成自動化的操作。  

- 環境搭建

1.安裝selenum:pip install selenium

2.獲取某一款瀏覽器的驅動程序(以谷歌瀏覽器為例) 

2.1 谷歌瀏覽器驅動下載地址

2.2 下載的驅動程序必須和瀏覽器的版本統一

大家可以根據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 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 = 'document.body.scrollTop=2000'
  bro.execute_script(js) # 該函數可以執行一組字符串形式的js代碼
  time.sleep(4)
  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()
          

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 99久久国产亚洲综合精品 | 久久sese | 久久99热精品这里久久精品 | 国内在线观看 | 一级毛片在线免费播放 | 亚洲天天做夜夜做天天欢人人 | 精品久久久久久无码中文字幕 | 日韩久久精品一区二区三区 | 天天草天天干天天 | 国产高清在线视频一区二区三区 | 黄视频网站免费看 | 欧美成人精品不卡视频在线观看 | 国产成人久久综合二区 | 久久综合久久自在自线精品自 | 中国美女一级a毛片录像在线 | 可以免费观看欧美一级毛片 | 黄片一级毛片 | 2022国产成人综合精品 | 伊人久久在线 | 日韩国产欧美成人一区二区影院 | 九天玄帝诀王凡小说免费阅读 | 欧美色老头oldvideos | 人人揉揉香蕉大免费不卡 | 欧美日韩在线观看区一二 | 久久国产自偷自免费一区100 | 国产区精品福利在线观看精品 | 99久久99久久精品免费看子伦 | 天天艹在线 | 精品一区二区三区在线观看视频 | 亚洲成a人伦理 | 精品国精品国产自在久国产不卡 | 成人午夜看片在线观看 | 欧美一级毛片片免费孕妇 | 91探花国产综合在线精品 | 91成人在线免费视频 | 久久精品国产999久久久 | 亚洲国产成人久久综合一区 | 国产成人亚洲综合小说区 | 天天谢天天干 | 日本成人不卡 | 久久国产小视频 |