|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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. 在下载图片时,可以使用断点续传等技术来提高下载可靠性。
|
|