目标
date:2020.5.25
author:pmy
aim:爬取google图片,关键词cat,两百张高清图(非缩略图)
现阶段:能够实现目标。在之前爬取谷歌图片的基础上(缩略图),这次进行了改进,爬取高清大图。
存在问题:爬取的效率不高,时间较长,只能完成数量,不能保证所见为所爬。等待之后学习改进
完整代码
# date:2020.5.25
# author:pmy
# aim:爬取google图片
#问题在于,不能保证所爬为所见from selenium import webdriver
import time
import os
import requests# 修改keyword便可以修改搜索关键词 建议也修改存储目录
keyword = 'cat'
url = 'https://www.google.com.hk/search?q=' + keyword + '&source=lnms&tbm=isch'class Crawler_google_images:# 初始化def __init__(self):self.url = url# 获得Chrome驱动,并访问urldef init_browser(self):chrome_options = webdriver.ChromeOptions()chrome_options.add_argument("--disable-infobars")browser = webdriver.Chrome(chrome_options=chrome_options)# 访问urlbrowser.get(self.url)# 最大化窗口,之后需要爬取窗口中所见的所有图片browser.maximize_window()return browser# 下载图片def download_images(self, browser, num=100):#存储路径picpath = './cat'# 路径不存在时创建一个if not os.path.exists(picpath): os.makedirs(picpath)count = 0 # 图片序号pos = 0# print(num)while (True):try:# 向下滑动js = 'var q=document.documentElement.scrollTop=' + str(pos)pos += 500browser.execute_script(js)time.sleep(1)# 找到图片# html = browser.page_source#也可以抓取当前页面的html文本,然后用beautifulsoup来抓取# 直接通过tag_name来抓取是最简单的,比较方便img_elements = browser.find_elements_by_xpath('//a[@class="wXeWr islib nfEiy mM5pbd"]')try:for img_element in img_elements:#点开大图页面img_element.click()time.sleep(0.5)try:# 这里balabala里面有好几个,所以要过滤一下# 取名好烦哦···balabalas = browser.find_elements_by_xpath('//img[@class="n3VNCb"]')if (balabalas):for balabala in balabalas:src = balabala.get_attribute('src')#过滤掉缩略图和无关干扰信息if src.startswith('http') and not src.startswith('https://encrypted-tbn0.gstatic.com'):print('Found' + str(count) + 'st image url')# img_url_dic.append(src)self.save_img(count, src, picpath)count += 1#爬取到指定数量图片后退出if (count >= num):return "stop"except:print('获取图片失败')#回退browser.back()time.sleep(0.3)except:print('获取页面失败')except:print("划不动了")def save_img(self, count, img_src, picpath):filename = picpath + '/' + str(count) + '.jpg'r = requests.get(img_src)with open(filename, 'wb') as f:f.write(r.content)f.close()def run(self):self.__init__()browser = self.init_browser()self.download_images(browser, 100) # 可以修改爬取的图片数browser.close()print("############爬取完成")if __name__ == '__main__':craw = Crawler_google_images()craw.run()
爬取效果