from lib2to3.pgen2 import driver
from tkinter.tix import IMAGETEXT
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
d=webdriver.Firefox() #创建一个浏览器驱动对象
def get_picpageurl(num):#获取图片主页的链接
hot='https://bbs.mihoyo.com/ys/home/29?type=hot'
d.get(url=hot) #打开热榜
if num<80:#计算网页下滑次数,不知道有什么好方法,只好用这种笨方法了
i=100
else:
i=((num//80)+1)*100
time.sleep(5)
for x in range(0,i):#下来一百次大约能搞八十张图
d.execute_script("window.scrollBy(0,300)")
for x in range(0,100):
d.execute_script("window.scrollBy(0,300)")
a=d.find_elements(By.CLASS_NAME,'mhy-img-article-card')
link3=[]
for x in a:
url=x.get_attribute('innerHTML')
bs=BeautifulSoup(url,'lxml')
link=bs.find(name='a',attrs={'class':'mhy-router-link'})
link2=link.get('href')
link3.append('https://bbs.mihoyo.com'+link2)
return link3
def get_picurl(target):
picurl2=[]
for x in target:
d.get(url=x) #打开目标页面
time.sleep(5) #有些网页是动态加载的,d.get()语句完成后网页中的元素不一定全部加载完成,等待5s,使所有的元素加载完成
img=d.find_element(By.CLASS_NAME,'mhy-img-article') #查找目标元素
url=img.get_attribute('innerHTML') #读取元素内的所有内容
b=BeautifulSoup(url,'lxml') #用beautifulsoup解析
img=b.find('img') #图片的链接在<img>这个标签内,使用beautifulsoup的find提取出标签内的内容
pic_url=img.get('large')#图片链接为src的值
picurl2.append(pic_url)
return picurl2
def download(url,name):
houzhui=url[-3:]
urlretrieve(url,str(name)+'.'+houzhui)
if __name__=='__main__':
options = webdriver.FirefoxOptions()
options.add_argument("--headless") #设置火狐为headless无界面模式
options.add_argument("--disable-gpu")
d=webdriver.Firefox(executable_path='D:\geckodriver.exe',options=options) #创建一个浏览器驱动对象
print('输入下载数量:')
n=int(input())
target=get_picpageurl(n) #获得插画页面链接
print('页面链接获取完成')
picurl=get_picurl(target) #获得插画图片的链接
print('插画链接获取完成')
i=0
for x in picurl:
download(x,i)
i=i+1
if i>=n:
break
print('下载完成')
d.close()
用了selenium和firefox,因为不会正则表达式和xpath,所以使用beautiful来找链接,没什么用,写着玩玩,米游社的图质量不算特别高,还是pixiv好