马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一个webdriver动态爬取图片的程序from selenium import webdriver
from bs4 import BeautifulSoup
import time
import requests
import os
PATH = os.getcwd()+"\\images\\崩坏:星穹铁道\"
def init(browser):
tmp=int(input("向下刷新几次?(这将会影响到您爬取帖子的数量)(请填写阿拉伯数字):"))
# 创建浏览器对象
# 打开网页
url = 'https://www.miyoushe.com/sr/search?keyword=%E5%90%8C%E4%BA%BA%E5%9B%BE'
browser.get(url)
time.sleep(5)
for i in range(tmp):
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(1)
html=browser.page_source
soup=BeautifulSoup(html,'html.parser')
webs=soup.find_all('a',{"class": "mhy-router-link mhy-article-card__link"})
for i in range(len(webs)):
webs[i]='https://www.miyoushe.com'+str(webs[i]['href'])
return webs
#等待加载(错误部分)
def wait1(browser):
try:
time.sleep(0.1)
html=browser.page_source
soup=BeautifulSoup(html,'html.parser')
tmp=soup.find('div',{'class':'mhy-layout mhy-main-page mhy-article-page'}).find_all('img',{"class":""})
print(tmp)
return soup
except:
print('unaccept')
wait1(browser)
def get_into_each_url(browser,url):
browser.get(url)
soup=wait1(browser)
tmp1=str(soup.find('title').text)
#去除非法字符
while ':' in tmp1:
tmp1=tmp1[:tmp1.find(':')]+':'+tmp1[tmp1.find(':')+1:]
while '<' in tmp1:
tmp1=tmp1[:tmp1.find('<')]+'《'+tmp1[tmp1.find('<')+1:]
while '>' in tmp1:
tmp1=tmp1[:tmp1.find('>')]+'》'+tmp1[tmp1.find('>')+1:]
while '?' in tmp1:
tmp1=tmp1[:tmp1.find('?')]+'?'+tmp1[tmp1.find('?')+1:]
while '|' in tmp1:
tmp1=tmp1[:tmp1.find('|')]+'-'+tmp1[tmp1.find('|')+1:]
tmp2=str(soup.find('div',{'class':'mhy-article-page-updatetime'}).find_all('span')[0].text)
file_name=tmp1[:tmp1.find('-崩坏')]+' '+tmp2[tmp2.find(":")+1:]+'\\'
print('正在爬取帖子《'+tmp1[:tmp1.find('-崩坏')]+'》图片')
imgs=soup.find_all('img',{"class":""})
i=0
while i<len(imgs):
imgs[i]=imgs[i]['src']
if (not("https://upload-bbs.miyoushe.com" in imgs[i])) or (not("?" in imgs[i])):
del imgs[i]
continue
i+=1
path=PATH+file_name
if not os.path.exists(path):
os.makedirs(path)
for i in range(len(imgs)):
res = requests.get(imgs[i])
j=len(imgs[i])-1
while imgs[i][j]!=',':
j-=1
with open(path+str(i+1)+'.'+imgs[i][j+1:],'wb') as img:
img.write(res.content)
def main_script():
option=webdriver.ChromeOptions()
option.add_argument('--headless')
browser = webdriver.Chrome(options=option)
urls=init(browser)
for i in range(len(urls)):
if 'https://www.miyoushe.com/bh3/404' in urls[i]:
continue
print(urls[i],end=':')
get_into_each_url(browser,urls[i])
browser.quit()
if __name__=="__main__":
main_script()
这个爬虫程序有几个问题:
1. 在函数 wait1 中,当出现异常时,虽然会递归调用 wait1 函数,但是没有返回值,会导致后面的代码出现错误。应该在递归调用 wait1 函数时,加上 return 语句。
2. 在函数 get_into_each_url 中,对于图片链接的过滤条件写得不够严谨。应该判断链接是否以 https://upload-bbs.miyoushe.com 开头,而不是判断链接中是否包含该字符串。
3. 在函数 get_into_each_url 中,如果下载的图片数量较多,会导致文件夹层级较深,不易管理。应该考虑将文件夹的命名方式改为更加简单明了的方式。
4. 在函数 get_into_each_url 中,下载的图片文件名是按照图片在页面中的顺序来命名的,这样会导致后面下载的图片可能会覆盖前面已经下载的图片。应该考虑使用图片的MD5值来作为文件名,这样可以保证文件名的唯一性。
优化建议:
1. 在爬取页面时,可以使用 requests 库来发送HTTP请求,而不是使用 webdriver 库。这样可以避免使用浏览器的开销,提高爬取效率。
2. 在爬取页面时,可以使用多线程或者异步IO等技术来提高爬取效率。
3. 在下载图片时,可以使用线程池或者协程等技术来提高下载效率。
4. 在下载图片时,可以使用断点续传等技术来提高下载可靠性。
|