Python图像抓取

Python图像抓取,python,python-3.x,selenium,Python,Python 3.x,Selenium,作为我论文的一部分,我正试图为学生建立一个大型培训数据语料库 我的代码运行在Conda3.7上,在我尝试抓取80多张图像之前,运行得非常好。就我而言,我需要几百张照片 Python代码 导入硒元素 从selenium导入webdriver 从selenium.webdriver.common.by导入 导入请求 从bs4导入BeautifulSoup 导入时间 输入io 导入操作系统 从PIL导入图像 导入hashlib def fetch_image_url(查询:str,max_links_

作为我论文的一部分,我正试图为学生建立一个大型培训数据语料库

我的代码运行在Conda3.7上,在我尝试抓取80多张图像之前,运行得非常好。就我而言,我需要几百张照片

Python代码
导入硒元素
从selenium导入webdriver
从selenium.webdriver.common.by导入
导入请求
从bs4导入BeautifulSoup
导入时间
输入io
导入操作系统
从PIL导入图像
导入hashlib
def fetch_image_url(查询:str,max_links_to_fetch:int,wd:webdriver,交互之间的睡眠:int=1):
def滚动至末端(wd):
wd.execute_脚本(“window.scrollTo(0,document.body.scrollHeight);”)
时间。睡眠(在互动之间睡眠)
#构建谷歌查询
搜索url=”https://www.google.com/search?safe=off&site=&tbm=isch&source=hp&q={q} &oq={q}&gs_l=img“
#加载页面
get(search_url.format(q=query))
image\u url=set()
图像计数=0
结果\u开始=0
当图像计数<最大值链接到获取时:
滚动至末端(wd)
#获取所有图像缩略图结果
缩略图\u结果=wd.find\u元素\u由\u css\u选择器(“img.Q4LuWd”)
数字结果=长度(缩略图结果)
打印(f“找到:{number\u results}搜索结果。从{results\u start}:{number\u results}提取链接”)
对于缩略图\u结果中的img[结果\u开始:编号\u结果]:
#试着点击每个缩略图,这样我们就可以得到它背后的真实图像
尝试:
img.click()
时间。睡眠(在互动之间睡眠)
除例外情况外:
持续
#提取图像URL
实际图片=wd。通过css选择器(“img.n3VNCb”)查找元素
对于实际图像中的实际图像:
如果实际_image.get_属性('src')和实际_image.get_属性('src')中的'http':
image\u url.add(实际的\u image.get\u属性('src'))
image\u count=len(image\u URL)
如果len(image\u url)>=max\u links\u to\u fetch:
打印(f“找到:{len(图像链接)}图像链接,完成!”)
打破
其他:
打印(“找到:”,len(图像链接),“图像链接,查找更多…”)
时间。睡眠(1)
返回
加载\u更多\u按钮=wd。通过\u css\u选择器(“mye4qd”)查找\u元素
如果加载更多按钮:
wd.execute_脚本(“document.querySelector('.mye4qd')。click();”)
#将结果起始点进一步向下移动
结果\u开始=len(缩略图\u结果)
返回图像URL
def persist_image(文件夹路径:str,url:str):
尝试:
image\u content=requests.get(url.content)
例外情况除外,如e:
打印(f“错误-无法下载{url}-{e}”)
尝试:
image\u file=io.BytesIO(图像内容)
image=image.open(image\u文件).convert('RGB')
file_path=os.path.join(文件夹_path,hashlib.sha1(image_content.hexdigest()[:10]+'.jpg'))
打开(文件路径“wb”)作为f:
图像保存(f,“JPEG”,质量=85)
打印(f“成功-保存{url}-为{file_path}”)
例外情况除外,如e:
打印(f“错误-无法保存{url}-{e}”)
#一旦图像数量超过80,就会显示错误
def search_和下载(搜索词:str,target_path='。/images',number_images=170):
target_folder=os.path.join(target_path,'.'.join(search_term.lower().split(''))
如果不存在os.path.exists(目标文件夹):
os.makedirs(目标文件夹)
使用webdriver.Chrome()作为wd:
res=fetch\u image\u URL(搜索词、数字图像、wd=wd、睡眠\u-interactions=0.5)
对于res中的元素:
持久化\u映像(目标\u文件夹,元素)
#在此处更改以修改搜索查询
搜索项='Hecht'
搜索和下载(
搜索词=搜索词,
)
以及日志中的错误 找到:93图片链接,寻找更多
回溯(最近一次呼叫最后一次):
文件“C:\Users\User\Desktop\Scraping\image gathering selenium\scrapy2.py”,第103行,在 搜索词=搜索词

文件“C:\Users\User\Desktop\Scraping\image Collection selenium\scrapy2.py”,第94行,在搜索和下载中
对于res中的元素:
TypeError:“非类型”对象不可编辑


您正在尝试迭代
res
,但它是
None
。这就是它抛出错误的原因

添加一个if条件:

if res:
对于res中的元素:
持久化\u映像(目标\u文件夹,元素)
或将空白列表添加到此行:

res=fetch\u image\u url(搜索词、数字图像、wd=wd、sleep\u interactions=0.5)或[]

尝试删除退货:

    else:
        print("Found:", len(image_urls), "image links, looking for more ...")
        time.sleep(1)
        # return
        load_more_button = wd.find_element_by_css_selector(".mye4qd")
        if load_more_button:
            wd.execute_script("document.querySelector('.mye4qd').click();")

谢谢错误消失了,但不知何故,它仍然只能找到多达80张图片。是一个包管理器。你是说(Python发行版)?请回复(视情况而定),而不是在评论中(没有“编辑”,“更新:”或类似内容-问题应该像今天写的一样出现)。解释将是合适的。
    else:
        print("Found:", len(image_urls), "image links, looking for more ...")
        time.sleep(1)
        # return
        load_more_button = wd.find_element_by_css_selector(".mye4qd")
        if load_more_button:
            wd.execute_script("document.querySelector('.mye4qd').click();")