python—爬取英雄聯盟皮膚圖片
- 2019 年 10 月 8 日
- 筆記
爬LOL的皮膚高清圖片的大致步驟就是用selenium去爬取英雄聯盟所以英雄的皮膚的url地址,然後在用requests庫去將圖片下載到本地。
爬取的第一步,先去分析網站。
皮膚圖片的位置在官網的資料庫,然後點擊英雄進入英雄介面

這裡就是皮膚的獲取地了。
按F12然後定位到圖片位置的程式碼

然後這裡就有第一個坑:
一開始他不會顯示所有皮膚的程式碼出來,你要點擊其他的皮膚後它才會顯示出全部的程式碼.

然後點進去看,裡面就有我們需要的url程式碼,和圖片的名稱了。

程式碼:
def get_pic_url(mapath): time.sleep(10) namepath = '//ul[@id="skinNAV"]/li' name_list = browser.find_elements_by_xpath(namepath)#小框
while len(name_list)<=1: browser.refresh() time.sleep(5) name_list = browser.find_elements_by_xpath(namepath)
name_list[1].click() time.sleep(2) lipath = '//*[@id="skinBG"]/li' li_list = browser.find_elements_by_xpath(lipath)#大圖的 for i in range(len(li_list)): imgpath = '//li['+str(i+1)+']/img' x = li_list[i].find_element_by_xpath(imgpath) if i ==0: name = x.get_attribute('alt') picpath = mapath + os.sep + str(name) if not os.path.exists(picpath): os.makedirs(picpath) #創建存放圖片的文件夾 else: print('文件夾已存在!!') pic_name = x.get_attribute('alt').replace('/','') pic_url = x.get_attribute('src') pic = requests.get(pic_url).content with open(picpath+os.sep+pic_name+'.png','wb') as p: p.write(pic)
定位的方法是用xpath定位的,在F12里可以複製xpath地址

然後在後面加/li,便是獲取所有的li裡面的數據了。
程式碼就是先獲取這裡的地址:

然後實現點擊下一個,然後在獲取大圖的內容。並用
get_attribute
提取出數據名和url,有一些英雄的名字有斜桿的,所有要替換掉,否則會報錯,有的時候會刷新不出來網頁,就獲取不到數據,緊接著報錯,加個循環如果獲取不到數據就重新獲取即可。
然後就是做循環爬取所有的英雄的圖片
一開始打算用英雄的url實現循環,仔細一看,後面幾個的英雄並不是疊加尾數,用url不能循環操作,所有利用selenium的自動化的便利性,做點擊,獲取圖片,然後返回英雄選擇介面,再點擊下一個等等,這樣子做循環。
if __name__ == '__main__': cwpath = os.getcwd() mpath = cwpath+os.sep+'LOL' if not os.path.exists(mpath): os.makedirs(mpath) else: print('文件夾已存在!!') browser.get(mainurl) time.sleep(5) h_path = '//*[@id="jSearchHeroDiv"]/li' h_list = browser.find_elements_by_xpath(h_path) i = 74 while i<len(h_list): h_list[i].click() get_pic_url(mpath) time.sleep(2) browser.back() i+=1 h_list = browser.find_elements_by_xpath(h_path)
對文件夾的操作,我這裡直接保存到項目文件夾下面,用os.getcwd()獲取當前路徑,也可以相應選擇你喜歡的位置,只需要換成絕對路徑即可,還有就是文件夾下面的文件夾的時候記得添加一個os.sep,
下面貼上os的常用操作
os.path.sep:#路徑分隔符
os.path.altsep: #根目錄
os.path.curdir:#當前目錄,其實就是一個.。
os.path.pardir:#父目錄,其實是兩個.。
os.path.abspath(path):#絕對路徑
os.path.join(): #常用來鏈接路徑,這個才是最重要的方法。
os.path.split(path): #把path分為目錄和文件兩個部分,以列表返回
最後爬取的效果就是這樣的:

唯一不足的就是爬取的速度很慢,因為加上太多的等待時間和瀏覽器操作的時間,不過效果還是可以的。