爬取所有英雄頭像
選擇爬取目標
這裏我們選擇
https://lol.qq.com/data/info-heros.shtml
尋找圖片位置
通過瀏覽器的檢查功能,尋找圖片所在位置
觀察發現所有英雄頭像都處於"<img src="">"裏面
所以,構建正則表達式如下
pattern1='<img src="(.+?)">'
是不是覺得騰訊的東西太簡單了?其實,你一爬就會發現根本沒有圖片後面我發現這裏使用的是js動態加載的
經過我反覆琢磨,終於發現資源文件都在//lol.qq.com/biz/hero/champion.js
引入selenium和phantomjs
dr = webdriver.PhantomJS()
用phantomjs 解析js
構造xpath對元素定位
img=dr.find_elements_by_xpath('//ul//li//a//img')
獲取每個英雄的名字和頭像url
觀察發現 每個img標籤的src屬性是url,alt屬性是名字
for i in img:
i.get_attribute('src')
i.get_attribute('alt')
最終步驟
最終代碼
from selenium import webdriver
import urllib.request
from bs4 import BeautifulSoup
#無頭瀏覽器
dr = webdriver.PhantomJS()
#打開網頁
dr.get('https://lol.qq.com/data/info-heros.shtml')
#xpath定位
img=dr.find_elements_by_xpath('//ul//li//a//img')
try:
for i in img:
name=i.get_attribute('alt')
url=i.get_attribute('src')
imgname="D:/picture/"+str(name)+".jpg"
#保存進本地
urllib.request.urlretrieve(url,filename=imgname)
except urllib.error.URLError as e:#簡單異常處理
pass
#退出瀏覽器
dr.quit()
結果展示
至此,148個英雄頭像爬取完畢
爬取裝備圖片
裝備與英雄的大部分都相同,只需簡單幾步即可實現爬取裝備圖片
https://lol.qq.com/data/info-item.shtml
xpath也稍微有點不一樣
dr.find_elements_by_xpath('//div//ul//li//img')
裝備的名稱位於img同級標籤
dr.find_elements_by_xpath('//div//ul//li//p')
圖片和名字是兩個列表
最終代碼
try:
j=1 # 因爲之前的xpath匹配出來多一個圖片,這裏從一開始去掉
for i in name_list:#遍歷name列表
name=i.text
url=img_list[j].get_attribute('src')#獲取圖片url
j=j+1
imgname="D:/picture/"+str(name)+".jpg"
print(name+url)
#保存進本地
urllib.request.urlretrieve(url,filename=imgname)
except urllib.error.URLError as e:#簡單異常處理
pass
成功展示
鞋子和打野刀存在命名重複,會被覆蓋一部分