网页爬虫抓取百度图片(现阶段深度学习有关的安装对应版本介绍参考网站如下)
优采云 发布时间: 2022-01-26 02:08网页爬虫抓取百度图片(现阶段深度学习有关的安装对应版本介绍参考网站如下)
2022-01-07
我正忙着找工作,现阶段我在同一个家庭。诚然,同事都是老板,我讲解了很多关于深度学习的知识。不过,我是菜鸟,因为公司的人工智能工作需要更多的图片。而我目前只知道爬虫,所以现阶段由公司的爬虫负责抓图。当然,百度图片很好抓。我还写了一个很好的代码来捕获。如有需要,您可以留言。作者在这里提供了完整的代码,这里就不分享百度图片的截图了。谷歌图片爬虫的作者还是想在这里分享一下,因为毕竟我花了一点时间才做出来的。
之所以要分享源码,是因为我发现网上关于爬取谷歌图片的介绍很少,而且有一个分享代码是加密收费mmp的。不要在意它是否有点低。废话不多说,直接说代码吧。
准备一:
对应版本的Chromedriver安装请参考网站如下:
https://blog.csdn.net/yoyocat915/article/details/80580066 # 参考版本【转载yoyocat915】
http://chromedriver.storage.googleapis.com/index.html # 对应版本下载
因为我之前的工作中没有硒,所以我今天才用它
2. 准备2:
上网准备,如果贵公司有,就不用买了。不想科学上网的可以去这个网站买一波广告。
https://e.2333.tn/ #购买的过程在这里就不介绍了
购买后调试。在这里,笔者被公司外网坑了不少。他直接提议在那儿坑,免得你被坑。
第一步:先调试成全局模式,否则只有谷歌可以访问外网,所以不能用其他浏览器访问外网(个人理解)
第 2 步:检查您使用的端口
ok 到这里几步就可以开始编码了,接下来分析下如何使用selenium+chrome进行抓图。共享代码如下。如果你对selenium的使用不是很熟练,基础教程就不在这里分享了,因为我也在学习过程中。代码流共享如下:
在此之前先介绍一下图片存储的用法:
urllib.request.urlretrieve(图片的路径.jpg结尾\图片的base64编码,‘储存的位置)
可以参考博客:https://blog.csdn.net/wuguangbin1230/article/details/77680058
好的初始代码版本 1.0
import os
import time
import urllib
from scrapy import Selector
from selenium import webdriver
class GoogleImgCrawl:
def __init__(self):
self.browser = webdriver.Chrome('F:\MyDownloads\chromedriver.exe')
self.browser.maximize_window()
self.key_world = input('Please input the content of the picture you want to grab >:')
self.img_path = r'D:\GoogleImgDownLoad' # 下载到的本地目录
if not os.path.exists(self.img_path): # 路径不存在时创建一个
os.makedirs(self.img_path)
def start_crawl(self):
self.browser.get('https://www.google.com/search?q=%s' % self.key_world)
self.browser.implicitly_wait(3) # 隐形等待时间
self.browser.find_element_by_xpath('//a[@class="iu-card-header"]').click() # 找到图片的链接点击进去
time.sleep(3) # 休眠3秒使其加载完毕
img_source = self.browser.page_source
img_source = Selector(text=img_source)
self.img_down(img_source) # 第一次下载图片
self.slide_down() # 向下滑动继续加载图片
def slide_down(self):
for i in range(7, 20): # 自己可以任意设置
pos = i * 500 # 每次向下滑动500
js = "document.documentElement.scrollTop=%s" % pos
self.browser.execute_script(js)
time.sleep(3)
img_source = Selector(text=self.browser.page_source)
self.img_down(img_source)
def img_down(self, img_source):
img_url_list = img_source.xpath('//div[@class="THL2l"]/../img/@src').extract()
for each_url in img_url_list:
if 'https' not in each_url: #仅仅就第一页可以,其他误判这个代码不是完整的是作者的错代码。
# print(each_url)
each_img_source = urllib.request.urlretrieve(each_url,
'%s/%s.jpg' % (self.img_path, time.time())) # 储存图片
if __name__ == '__main__':
google_img = GoogleImgCrawl()
google_img.start_crawl()
这里遇到的坑如下:
截图一:
前20张图片的src显示的是base64编码,所以可以直接用上面的代码解决,但是你后面的图片的src是什么?如下所示
这里既不是 base64 也不是 .jpg。我如何在这里保存它?你用
self.browser.get(图片的地址)
img_source = self.browser.page_source
继续经历这个?如果你这样想,那你就错了,因为我们还是拿到了完整的页面,那么这个时候我们该怎么办呢?想到我们最初使用requests来请求图片地址,这时候作者就简单的尝试着拿出一个单独的图片src去请求,不加代理就错了。因此,添加代理会导致以下结果:
import time
import requests
proxy = {"https": "https://127.0.0.1:8787"} //端口作者在前边的坑已经介绍了需要外网的端口
response = requests.get(
'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTwwkW09Hrnq5DOzSYAKqrxv3uGjbQzoCRP28AOF03pzJ2uFObS',
proxies=proxy, verify=False)
with open('./image%s.jpg' % time.time(), 'wb')as f:
f.write(response.content)
结果就是想要的结果
那么你知道如何修改上面的代码吗?哈哈哈可能有点乱
修改代码如下:
import os
import time
import urllib
import requests
from scrapy import Selector
from selenium import webdriver
class GoogleImgCrawl:
def __init__(self):
self.proxy = {"https": "https://127.0.0.1:8787"} #初始化代理
self.browser = webdriver.Chrome('F:\MyDownloads\chromedriver.exe')
self.browser.maximize_window() #最大的适应屏幕
self.key_world = input('Please input the content of the picture you want to grab >:')
self.img_path = r'D:\GoogleImgDownLoad' # 下载到的本地目录
if not os.path.exists(self.img_path): # 路径不存在时创建一个
os.makedirs(self.img_path)
def start_crawl(self):
self.browser.get('https://www.google.com/search?q=%s' % self.key_world)
self.browser.implicitly_wait(3) # 隐形等待时间
self.browser.find_element_by_xpath('//a[@class="iu-card-header"]').click() # 找到图片的链接点击进去
time.sleep(3) # 休眠3秒使其加载完毕
img_source = self.browser.page_source
img_source = Selector(text=img_source)
self.img_down(img_source) # 第一次下载图片
self.slide_down() # 向下滑动继续加载图片
def slide_down(self):
for i in range(7, 20): # 自己可以任意设置
pos = i * 500 # 每次向下滑动500
js = "document.documentElement.scrollTop=%s" % pos
self.browser.execute_script(js)
time.sleep(3)
img_source = Selector(text=self.browser.page_source)
self.img_down(img_source)
def img_down(self, img_source):
img_url_list = img_source.xpath('//div[@class="THL2l"]/../img/@src').extract()
for each_url in img_url_list:
if 'https' not in each_url:
# print(each_url)
each_img_source = urllib.request.urlretrieve(each_url,
'%s/%s.jpg' % (self.img_path, time.time())) # 储存图片
else: #在这里添加一个不久行了吗?如果图片的链接不是base64的
response = requests.get(each_url,proxies=self.proxy, verify=False)
with open('D:\GoogleImgDownLoad\%s.jpg' % time.time(), 'wb')as f:
f.write(response.content)
if __name__ == '__main__':
google_img = GoogleImgCrawl()
google_img.start_crawl()
以上就是分享的结束。当然,直接使用requests模块+代理更方便。百度的爬虫这里就不分享了。如果你想联系源代码的作者,我会分享给你。当然,美中不足的是,这里不需要对图片进行去重,非常简单。不知道你有没有什么想法。无论如何,作者在这里有想法。已经是深夜了,我们睡个午觉吧。
分类:
技术要点:
相关文章: