鱼C论坛

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

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

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

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

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

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()
    
最佳答案
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-11-15 10:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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