終于是放假了,上篇博客留了點尾巴,我也是放假后第“一”時間就給大家趕了出來
沒看上一篇的,請!點這里,
好,那接下來就要正式講講動態爬取圖片了
其實動態爬蟲,說白了,就是讓程式模仿人為操作(例如:打開網頁——打開某圖片鏈接——選擇圖片(滑鼠移到圖片上)——右鍵——圖片另存為),那么,既然是要讓程式模仿人為操作,先要把瀏覽器驅動下載好(這個可以自己去網上搜,挺多的)
這里我是以谷歌瀏覽器為例,做為我的程式執行瀏覽器,
例子網站,依然是天堂圖片網
我在上篇博客里的爬蟲的流程,思路,以及后期代碼的具體完善講的都差不多了,也就不重復了,下面就主要根據網頁源代碼來講了,
首先,我們得先定位元素,定位元素的方法很多(class、id、xpath等等等等)先看網頁源代碼:

可以看到,我們想爬取的第一個圖片集的元素被一個"class=‘il_img’"標簽包起來了,那么我們用下面方法定位元素:
driver=webdriver.Chrome(r'C:\Users\VULCAN\Desktop\chromedriver.exe')#谷歌瀏覽器
driver.get('https://www.ivsky.com/tupian/ziranfengguang/')#訪問網頁
urls=driver.find_elements_by_class_name('il_img')
這里注意,find_element _······是定位一個元素,find_elements_······是定位多個元素
接著,我們點開第一個圖片集,然后,我們會發現網頁會變成這樣:
也就是說,我們點擊第一個圖片集后,會出現一個新的頁面
這里注意:我們原本的網頁定位是定位在第一個網頁的,這里有新增加了一個網頁,而網頁定位是不會自己改變的,那么,這里我們得讓網頁定位到這個新打開的網頁上就要用到switch_to_window()方法,
如果你用以下方法輸出網頁:
print(driver.window_handles)
#['CDwindow-3DDF0E0EAD738DFB428C4CC52C8D42C7', 'CDwindow-C02AA9491E38E7A11056C73A560BA80D']
可以看到,當前打開的兩個網頁在程式中是以串列的形式保存的,
那么,我們打開圖片集完整的方法就是
for url in urls:
time.sleep(2)
url.click()#點擊
driver.switch_to_window(driver.window_handles[1])
然后,我們在新的網頁中找到要定位的元素:

可以看到,也是被“class=‘il_img’”標簽包起來的,那么方法跟上面基本一致,
但是,我們可以看到,我們想獲取的每個圖片的url就在img標簽下,那么,這里我們就直接定位到img標簽,然后獲取其中的src就可以了,
具體實作:
pics=driver.find_elements_by_class_name('il_img')
for pic in pics:
time.sleep(1)
pic_url=pic.find_element_by_css_selector('img').get_attribute('src')#定位img標簽,獲取其中的src
最后,也要考慮到一個翻頁操作:
try:#如果有下一頁
next_page=driver.find_element_by_partial_link_text('下一頁')#文本定位
next_page.click()
get_pics(driver)
except:#如果沒有下一頁,就回到最開始的界面,繼續爬取下一個圖片集
driver.close()#關閉當前頁
driver.switch_to_window(driver.window_handles[0])
這里注意:當你用find_element_······方法定位任何元素時,若沒有該元素,程式會直接報錯,所在這里用上try-except方法,
完整代碼
from selenium import webdriver
import time
def spider():
driver=webdriver.Chrome(r'C:\Users\VULCAN\Desktop\chromedriver.exe')#谷歌瀏覽器
driver.get('https://www.ivsky.com/tupian/ziranfengguang/')#訪問網頁
get_url(driver)
#二,定位商品資料抓取
def get_url(driver):
urls=driver.find_elements_by_class_name('il_img')#查找多個節點
for url in urls:
time.sleep(2)
url.click()#點擊
get_pics(driver)
def get_pics(driver):
time.sleep(2)
driver.switch_to_window(driver.window_handles[1])#定位網頁,很重要的一步
pics=driver.find_elements_by_class_name('il_img')
for pic in pics:
time.sleep(1)
pic_url=pic.find_element_by_css_selector('img').get_attribute('src')#定位img標簽,獲取其中的src
print(pic_url)
try:#如果有下一頁
next_page=driver.find_element_by_partial_link_text('下一頁')#文本定位
next_page.click()
get_pics(driver)
except:#如果沒有下一頁,就回到最開始的界面,繼續爬取下一個圖片集
driver.close()#關閉當前頁
driver.switch_to_window(driver.window_handles[0])
spider()
其實這并不是完全完整的代碼,還有很多功能沒有完善,比如:圖片的下載保存(保存的方法其實跟我上篇博客講的差不多);爬取多頁圖片(對于翻頁,這里我就提了一下,相信你們可以寫出來)
最后再提一個注意點:用動態爬蟲時,適當用sleep()方法很重要,如果不設定,那么程式點擊網頁的速度過快,可能就會直接報錯,
另外,就是我這個方法爬取圖片的速度可能會很慢,好學的小伙伴可以去學習多執行緒、協程等加快爬蟲爬取速度的方法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/244370.html
標籤:python
