從英雄聯盟皮膚網站的網頁源代碼中獲取不到英雄的皮膚地址 通過selenium可以輕鬆獲取想要的內容
源碼展示
from selenium import webdriver
from time import sleep
from pyquery import PyQuery as pq
import os,requests
from config import *
import pymongo
from selenium.common.exceptions import NoSuchElementException
browser = webdriver.Chrome()
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]
def get_hero_url():
browser.get("http://lol.qq.com/web201310/info-heros.shtml")
html = browser.page_source
doc = pq(html)
#通過PyQuery解析出來的網頁 用css選擇器獲取li標籤內容 並返回一個生成器
items = doc('#jSearchHeroDiv.imgtextlist li').items()
#通過循環獲取生成器下的內容
for item in items:
data ={
'hero_url':'http://lol.qq.com/web201310/'+item.find('a').attr('href'),
'hero_name':item.find('p').text()
}
#print(len(data['hero_url']))
# 在網頁加載的時候可能會因爲網絡的問題 圖片會加載不出來 然後css選擇器就獲取不到相應的內容
#從未拋出異常 拋出異常後讓網頁重新加載一次
try:
get_hero_skin(data['hero_url'])
except NoSuchElementException:
print('出現異常再次請求網頁')
get_hero_skin(data['hero_url'])
def get_hero_skin(url):
browser.get(url)
sleep(1)
#只有點擊第二個皮膚的時候所有的皮膚纔會在網頁的代碼中顯示出來
#所以這裏設置了個自動點擊的功能才能獲取到英雄的所有皮膚
#否則只能獲取到一個默認皮膚
skin = browser.find_element_by_css_selector('#skinNAV > li:nth-child(2)')
skin.click()
html = browser.page_source
doc = pq(html)
items = doc('.defail-skin #skinBG li').items()
for item in items:
data ={
'title':item.find('img').attr('alt'),
'image':item.find('img').attr('src')
}
#print(data)
save_to_mongo(data)
download_image(data['image'],data['title'])
def download_image(image_url,title):
if not os.path.exists('images'):
os.mkdir('images')
response = requests.get(image_url)
if response.status_code == 200:
#每個英雄的第一個都是默認皮膚所以在保存到本地時候會將
#之前的默認皮膚覆蓋 所以文件中一個最後一個默認皮膚的圖片
# 這裏可以自己簡單修改下
file_path = 'images/{}.jpg'.format(title)
if not os.path.exists(file_path):
print("正在獲取%s的信息" % (title))
# 圖片以二進制格式保存
with open(file_path, 'wb')as f:
# content獲取圖片內存
f.write(response.content)
else:
print("已經保存該圖片")
def save_to_mongo(data):
try:
#保存到mongodb數據庫下的每一個數據都會有自己的id
#所以數據庫中的每個英雄的默認皮膚不會受到影響
if db[MONGO_TABLE].insert(data):
print("存儲到數據庫成功",data)
except Exception:
print('存儲到數據庫錯誤',data)
get_hero_url()
browser.close()
存儲到MongoDB數據庫需要一個配置文件
MONGO_URL = 'localhost'
MONGO_DB = 'lolskin'
MONGO_TABLE = 'allHeroSkin'
小結
selenium確實很容易將所有的皮膚爬取下來 但是效率太低 用進程池或者多線程是不是效率可以提高了 希望大佬可以提提建議