鱼C论坛

 找回密码
 立即注册
查看: 1565|回复: 30

[已解决]大佬帮忙看看,这个爬虫程序到底是哪里出了问题,顺便帮忙优化一下?

[复制链接]
回帖奖励 8 鱼币 回复本帖可获得 1 鱼币奖励! 每人限 1 次(中奖概率 10%)
发表于 2023-5-14 21:22:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一个webdriver动态爬取图片的程序
  1. from selenium import webdriver
  2. from bs4 import BeautifulSoup
  3. import time
  4. import requests
  5. import os
  6. PATH = os.getcwd()+"\\images\\崩坏:星穹铁道\"

  7. def init(browser):
  8.     tmp=int(input("向下刷新几次?(这将会影响到您爬取帖子的数量)(请填写阿拉伯数字):"))
  9.     # 创建浏览器对象
  10.    
  11.     # 打开网页
  12.     url = 'https://www.miyoushe.com/sr/search?keyword=%E5%90%8C%E4%BA%BA%E5%9B%BE'
  13.     browser.get(url)
  14.     time.sleep(5)
  15.     for i in range(tmp):
  16.         browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
  17.         time.sleep(1)
  18.     html=browser.page_source
  19.     soup=BeautifulSoup(html,'html.parser')
  20.     webs=soup.find_all('a',{"class": "mhy-router-link mhy-article-card__link"})
  21.     for i in range(len(webs)):
  22.         webs[i]='https://www.miyoushe.com'+str(webs[i]['href'])
  23.     return webs
  24. #等待加载(错误部分)
  25. def wait1(browser):
  26.     try:
  27.         time.sleep(0.1)
  28.         html=browser.page_source
  29.         soup=BeautifulSoup(html,'html.parser')
  30.         tmp=soup.find('div',{'class':'mhy-layout mhy-main-page mhy-article-page'}).find_all('img',{"class":""})
  31.         print(tmp)
  32.         return soup
  33.     except:
  34.         print('unaccept')
  35.         wait1(browser)
  36.         
  37. def get_into_each_url(browser,url):
  38.     browser.get(url)
  39.     soup=wait1(browser)
  40.     tmp1=str(soup.find('title').text)
  41.     #去除非法字符
  42.     while ':' in tmp1:
  43.         tmp1=tmp1[:tmp1.find(':')]+':'+tmp1[tmp1.find(':')+1:]
  44.     while '<' in tmp1:
  45.         tmp1=tmp1[:tmp1.find('<')]+'《'+tmp1[tmp1.find('<')+1:]
  46.     while '>' in tmp1:
  47.         tmp1=tmp1[:tmp1.find('>')]+'》'+tmp1[tmp1.find('>')+1:]
  48.     while '?' in tmp1:
  49.         tmp1=tmp1[:tmp1.find('?')]+'?'+tmp1[tmp1.find('?')+1:]
  50.     while '|' in tmp1:
  51.         tmp1=tmp1[:tmp1.find('|')]+'-'+tmp1[tmp1.find('|')+1:]
  52.     tmp2=str(soup.find('div',{'class':'mhy-article-page-updatetime'}).find_all('span')[0].text)
  53.     file_name=tmp1[:tmp1.find('-崩坏')]+' '+tmp2[tmp2.find(":")+1:]+'\\'
  54.     print('正在爬取帖子《'+tmp1[:tmp1.find('-崩坏')]+'》图片')
  55.     imgs=soup.find_all('img',{"class":""})
  56.     i=0
  57.     while i<len(imgs):
  58.         imgs[i]=imgs[i]['src']
  59.         if (not("https://upload-bbs.miyoushe.com" in imgs[i])) or (not("?" in imgs[i])):
  60.             del imgs[i]
  61.             continue
  62.         i+=1
  63.     path=PATH+file_name
  64.     if not os.path.exists(path):
  65.         os.makedirs(path)
  66.     for i in range(len(imgs)):
  67.         res = requests.get(imgs[i])
  68.         j=len(imgs[i])-1
  69.         while imgs[i][j]!=',':
  70.             j-=1
  71.         with open(path+str(i+1)+'.'+imgs[i][j+1:],'wb') as img:
  72.             img.write(res.content)
  73.             
  74.             

  75. def main_script():
  76.     option=webdriver.ChromeOptions()
  77.     option.add_argument('--headless')
  78.     browser = webdriver.Chrome(options=option)
  79.     urls=init(browser)
  80.     for i in range(len(urls)):
  81.         if 'https://www.miyoushe.com/bh3/404' in urls[i]:
  82.             continue
  83.         print(urls[i],end=':')
  84.         get_into_each_url(browser,urls[i])
  85.     browser.quit()
  86. if __name__=="__main__":
  87.     main_script()
  88.    
复制代码
最佳答案
2023-5-14 21:24:21
这个爬虫程序有几个问题:

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. 在下载图片时,可以使用断点续传等技术来提高下载可靠性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 21:24:21 | 显示全部楼层    本楼为最佳答案   
这个爬虫程序有几个问题:

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. 在下载图片时,可以使用断点续传等技术来提高下载可靠性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-14 21:43:23 | 显示全部楼层
isdkz 发表于 2023-5-14 21:24
这个爬虫程序有几个问题:

1. 在函数 wait1 中,当出现异常时,虽然会递归调用 wait1 函数,但是没有返回 ...

可以用requests库吗?
网站是用javascript动态刷新页面的,webdriver应该是最简便的——吧?

多线程不会……(菜鸟一个爬虫,涉猎不深,只是突然想写一个爬虫而已)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-14 21:44:50 | 显示全部楼层
isdkz 发表于 2023-5-14 21:24
这个爬虫程序有几个问题:

1. 在函数 wait1 中,当出现异常时,虽然会递归调用 wait1 函数,但是没有返回 ...

返回值本来应该是变量soup,但不知道为什么返回不了?NopeType……
是要改成global吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-14 22:23:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 22:23:55 | 显示全部楼层
嘿嘿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 22:47:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 22:47:41 | 显示全部楼层

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
歌者文明清理员 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 22:47:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 22:49:49 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 22:50:08 | 显示全部楼层

回帖奖励 +1 鱼币

报错代码捏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-14 22:51:48 | 显示全部楼层
应该是找不到.Find_all(div,{'class':''})
然后递归,还是报错
最大递归次数错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-15 08:59:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-15 09:31:54 | 显示全部楼层
学习中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-15 18:58:48 | 显示全部楼层
歌者文明清理员 发表于 2023-5-14 22:51
应该是找不到.Find_all(div,{'class':''})
然后递归,还是报错
最大递归次数错误

敢问大佬说的是哪一句?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-15 19:00:50 | 显示全部楼层
chenyiyun 发表于 2023-5-15 18:58
敢问大佬说的是哪一句?

line 31
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-15 19:14:45 | 显示全部楼层
chenyiyun 发表于 2023-5-14 21:44
返回值本来应该是变量soup,但不知道为什么返回不了?NopeType……
是要改成global吗?

呃,是我唐突了,居然忘加了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-15 19:39:22 | 显示全部楼层

评分

参与人数 1荣誉 -5 贡献 -3 收起 理由
歌者文明清理员 -5 -3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-20 13:06:09 | 显示全部楼层

评分

参与人数 1荣誉 -5 贡献 -3 收起 理由
歌者文明清理员 -5 -3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-20 19:19:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-4 04:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表