OK,上一章我們已經配置好爬蟲所需的環境,現在就可以大展身手了!
一、獲取圖片網址
首先打開pythonIDLE輸入:
from selenium import webdriver
driver = webdriver.Chrome()#用selenium庫打開谷歌瀏覽器
#或driver = webdriver.Chrome(executable_path=r'C:/Users/dell/anaconda3/chromedriver.exe')
#博主自己的Chromewebdriver就下在C:\Users\dell\anaconda3\,如果直接復制記得把反斜杠改為斜杠
(如果有報錯看一下注釋和上一章的注意事項,多半是版本問題)
如無意外瀏覽器成功打開:

(打開之后會看見上面有一行“瀏覽器正受到自動化軟體控制,問題不大,下一章我們會說怎么去除)
開始前復習一下上一章的網頁基本知識,下面按 找節點-->找要素-->得到要素的值
- 節點的名稱有的叫div,有的叫a,有的叫img,
- 我們所需的要素也有一個名稱,有的叫class,有的叫id,有的叫src,
- 這些節點里面的要素有一個值(比如class=“”里面的東西),網頁上所有的元素,都存放在這一個個值中,通過這些要素的值,我們可以尋找到特定的節點;也可以根據值的名稱,在節點里獲取這個值
- 我們所需的圖片地址,一般就是img節點的src要素的值
再看一下要用的函式
- find_elements類——根據關鍵詞(節點名稱或者節點內要素的值)回傳一個陣列,其中每個元素的型別是網路元素
- find_element類——根據關鍵詞回傳一個網路元素
- get_attribute——根據要素的名稱回傳要素的值,型別是字串或數字
接下來,我們寫程式的大思路就是 找圖片所在節點-->找圖片地址所在要素-->得到要素的值
而實作的方式就是用find_element(s)類函式找節點,用get_attribute函式找要素的值
01找圖片所在節點
也就是,我們要定位到img節點
以花瓣https://huaban.com/discovery/travel_places/為例
driver.get('https://huaban.com/discovery/travel_places/')
這時點F12,打開開發者工具,找節點思路如下:
1.具體分析網路元素
- 首先對一個圖片右鍵檢查,看看想要的圖片地址在哪里——發現圖片地址就在img節點里面src元素的值里
- 然后看img節點是否包含在一個有特征要素值的節點中——找到了img節點包含在a節點里面,這個a節點有一個要素class 叫做'img x layer-view loaded'
注意:
- 要找包含img節點的節點(上級節點),同級別節點(縮進相同)無效
- 所謂特征要素值指的是,通過它就可以找到所有包含img節點的上級節點
2.驗證特征要素值是否OK
在打開開發者工具的情況下,按Ctrl+F,找class叫img x layer-view loaded的節點

發現的確就找到了所有img節點的上級節點,所以這個特征要素值可行
3.代碼實作
方法一分步找(在這個例子中不行):
target = driver.find_elements_by_class_name('img x layer-view loaded')
t0 = target[0]
img_list0 = t0.find_element_by_tag_name('img')#fine_element需要對單個元素操作
#在IDLE中我們先單個取,運行正常后再復制到pycharm寫成回圈形式
#dir(target)
#dir(t0)
#len(img_list)
注意:
- 這個找法會報錯(狗頭)——因為用find_element(s)_by_class_name的名稱中不能有空格
- find_element類函式不能對陣列使用,只能對元素使用(所以例子中先取了一個元素)
- 可以用dir()函式查看一個變數包含了哪些類函式(如dir(t0))
- 可以用len()函式查看一個陣列的長度,檢驗是否獲取到了所需的元素(如len(target))
方法二xpath找:
img_list = driver.find_elements_by_xpath('//*[@class="img x layer-view loaded"]/img')
#或img_list = driver.find_elements_by_xpath('//a[@class="img x layer-view loaded"]/img')
#但有時候指明節點名容易報錯,博主個人更喜歡通配符法
用xpath語法在selenium庫中找元素是很主流的,簡單的介紹一下:
- 開頭:相對路徑查找——//;絕對路徑查找——/(比如上面的例子,就是相對路徑開始,絕對路徑麻煩一般不用
- 節點中:根據要素的值找——*[@class=""];*[@id=""](上面例子用了class要素)
- 節點間:直接子節點——/;間接子節點——//(該例子中img節點是a節點的直接子節點)
感興趣的同學可以看看這篇文章:
爬蟲Xpath語法詳解_T型人小付的博客-CSDN博客
另外通過開發者工具,我們也可以把某個元素的xpath找出來
注意:
- xpath語法和selenium庫中的xpath語法不盡相同,有傳聞說不要超過兩個節點,總之太復雜的時候就分步取,還是這個例子:
target = driver.find_elements_by_xpath('//*[@class="img x layer-view loaded"]')
t0 = target[0]
img_list0 = t0.find_element_by_tag_name('img')
2.在IDLE除錯正確才寫入pycharm,因為xpath報錯會很大一堆,極影響心態
方法三css找:
css也要求節點名無空格,因此這里不推薦
后面第四章我們講到爬取商品資訊時會較多用到css查找
4.下面分別再用這三種方法,看另一個實戰案例

爬取某二次元圖片網站https://pixivel.moe/rank/獲取圖片所在節點
觀察到影像都在一個class名為one-img的div節點中(要使用Ctrl+F檢驗)
方法一分步查找
img_list = driver.find_elements_by_class_name('one-img') #這個案例一個要素名就搞定了方法二xpath查找
img_list = driver.find_elements_by_xpath('//*[@class="card the-img shadow--hover waterfall-item"]/div[2]') #或img_list = driver.find_elements_by_class_name('one-img')#這個更直接方法三css查找
img_list = driver.find_elements_by_css_selector('one-img')
02獲取節點里要素的值(即圖片網址)
無論用哪種方法上一步我們已經得到了一個由所有圖片所在節點組成的陣列,現在來取圖片網址
img_list0 = img_list[0]
img_path0 = img_list0.get_attribute('src')
#dir(img_path0)
這個img_path0就是我們成功獲得的第一個圖片網址!
然后我們寫成回圈遍歷一下即可
img_path = []
for img in img_list:
path = img.get_attribute('src')
img_path.append(path)
現在得到的img_path陣列里面就是所有圖片的網址!
二、下載圖片
01修正網址
其實,上一步我們說已經得到所有圖片網站,是不嚴謹的
首先有的網站爬取下來的網址不含http://或https://
其次是網站里面多半有防爬和略縮圖機制存在,有時候爬取到的地址、在原頁面中查看的圖片地址和點入圖片查看到的地址都是不同的!!!(離譜)
所以這就是為什么有的同學按教程爬到了圖片,非常高興,打開一看卻全是小圖
因此在寫進回圈前,我建議還要print一下圖片網址
以這張圖片為例
[1]爬取到的https://hbimg.huabanimg.com/f4222449cb11ee162a75eb366572cfc80738e1171b47d-exEtQp_fw236/format/webp
[2]原網頁的(圖2-1)https://hbimg.huabanimg.com/f4222449cb11ee162a75eb366572cfc80738e1171b47d-exEtQp_fw236/format/webp
[3]原圖的(圖2-2)??????https://hbimg.huabanimg.com/f4222449cb11ee162a75eb366572cfc80738e1171b47d-exEtQp_fw658/format/webp
可以發現我們爬取到的網址和原圖有一個數字的差別,需要用字串操作修正
這里用到的是字串的截取和相加,要用時在CSDN查找“python字串操作”翻閱即可
img_list0 = img_list0[0:-12] + 'fw658/format/webp'
寫進回圈里面
img_path = []
for img in img_list:
path = img.get_attribute('src')
path = path[0:-12] + 'fw658/format/webp'
img_path.append(path)
現在得到的img_path陣列就是高清原圖陣列啦!
02由網址下載圖片
首先要在程式最開頭import兩個庫(requests是外部庫,os是內部庫)
然后按照這個模板寫代碼就OK
import requests
import os
img_dir = os.path.join(os.curdir, 'travel_images')#traval_images是檔案夾名稱
'''創建檔案夾'''
if not os.path.isdir(img_dir):
os.mkdir(img_dir)
'''下載圖片'''
for path in img_path:
img_name = 'flower' + path.split('/')[-3] + '.jpg'#圖片名稱
filepath = os.path.join(img_dir, img_name)
resp = requests.get(img)
with open(filepath, 'wb') as f:
for chunk in resp.iter_content(1024):#限速寫入圖片
f.write(chunk)
(注意:如果同學們心急在pycharm上運行,記得一定要在最頂端輸入
# -*- coding:UTF-8 -*-
不要問問就是編碼方式)
上一章是完整配置流程歡迎進去坐坐
(35條訊息) 【小白+python+selenium庫+圖片爬取+反爬+資料】超詳細新手實作(01)webdriver環境配置+新手基礎知識_白熊快跑的博客-CSDN博客
https://blog.csdn.net/qq_53021454/article/details/120538464?spm=1001.2014.3001.5501
下一章會繼續仔細講程式在pycharm上運行,包括防爬+翻頁+完整代碼,喜歡的朋友請追更~
過路的小伙伴覺得有用的話請幫我多多分享點贊!!!這對小透明的我很重要,感謝!
我們下章見~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/305690.html
標籤:python
上一篇:2021-10-05集訓
