1. 程式人生 > >爬蟲之 圖片懶加載, selenium , phantomJs, 谷歌無頭瀏覽器

爬蟲之 圖片懶加載, selenium , phantomJs, 谷歌無頭瀏覽器

ext htm ora cep eight html_ all strong 自動化

一.圖片懶加載

什麽是圖片懶加載?

  • 案例分析:抓取站長素材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/@src2) #src2偽屬性
         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 = rPhantomJS驅動路徑
browser = webdriver.PhantomJS(path)

# 打開百度
url = http://www.baidu.com/
browser.get(url)

time.sleep(3)

browser.save_screenshot(rphantomjs\baidu.png)

# 查找input輸入框
my_input = browser.find_element_by_id(kw)
# 往框裏面寫文字
my_input.send_keys(美女)
time.sleep(3)
#截屏
browser.save_screenshot(rphantomjs\meinv.png)

# 查找搜索按鈕
button = browser.find_elements_by_class_name(s_btn)[0]
button.click()

time.sleep(3)

browser.save_screenshot(rphantomjs\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 = rC:\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 = rC:\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()

爬蟲之 圖片懶加載, selenium , phantomJs, 谷歌無頭瀏覽器