小言_互联网的博客

python爬取美食图片

446人阅读  评论(0)

欢迎加入我们卧虎藏龙的python讨论qq群:729683466

导 语 ●

最近重温了一遍《舌尖上的中国》

瞬间就被里面的美食吸引了

于是我就百度了一下这些美食

发现了好多“色香味”俱全的美食

然后我发现

这些图片其实可以用爬虫

下载到电脑里面啊!!

代码及相关资源获取

1:关注“python趣味爱好者”公众号,回复“ 美食”获取源代码

  

效果演示

往期精选

分享一个python调试程序的技巧

国庆节画一面《五星红旗》

 ????

开发工具

python3.6.4

第三方库:

 argparse,os, re, sys, urllib,json,socket

讲解部分

一:目标网页

我们要爬取的对象是百度,也就是百度图库里面的美食图片。这就是百度图片的网址。

我们要输入关键词,然后搜索。

我们尝试着输入“美食”,然后搜索,看看网址会怎样变化。

可以看到,搜索美食以后,出现了很多美食的图片。然后当前的网址变成了这样子:

https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E7%BE%8E%E9%A3%9F&oq=%E7%BE%8E%E9%A3%9F&rsp=-1

“美食”这个关键词进入了这个网址之中,当然,由于编码格式的差异,在这里我们看不到“美食”这两个汉字。

二:爬取图片

我们先定义一个爬虫的类,下面是部分截图。这个类里面是爬虫所需的一些函数,例如发送请求,解析网页,存储图片之类的。

在爬取图片时,为了防止被网站识别成爬虫,我们需要伪造一个headers。

 headers = {'User-Agent''Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}

然后,我们用urllib里面的request里面的Request响url发送请求。


   
  1. try:
  2. time.sleep( self.time_sleep)
  3. req = urllib.request.Request(url=url, headers= self.headers)
  4. page = urllib.request.urlopen(req)
  5. rsp = page.read()
  6. except UnicodeDecodeError as e:
  7. print(e)
  8. print( '-----UnicodeDecodeErrorurl:', url)

如果我们的请求得到了服务器的回应,那么返回的网页信息就会存在req里面。然后我们解析这个网页。

有些时候,我们不能得到服务器的回应,那我们就需要做一下异常处理,用print打印出出现的错误。

三:保存图片

获得网页信息并且解析网页以后,我们就可以将图片保存到本地。我们专门定义了一个函数用来保存图片。首先判断当前文件夹里面有没有用来存图片的文件夹,如果有就跳过,如果没有,就新建一个文件夹。新建文件夹的函数就是os.mkdir。

部分保存图片代码如下:


   
  1. filepath = './%s/%s' % (word, str( self.__counter) + str(suffix))
  2. urllib.request.urlretrieve(url, filepath)
  3. if os.path.getsize(filepath) < 5:
  4. print( "下载到了空文件,跳过!")
  5. os.unlink(filepath)
  6. continue
  7. except urllib. error.HTTPError as urllib_err:
  8. print(urllib_err)

其中filepath就是图片应该保存的路径。如果出现了异常,就做一下异常处理。

前面说的都是这个crawler的定义,然后,再主函数中我们就可以实例化这个对象。代码就是这样:crawler = Crawler(args.delay)

实例化完成之后,调用其中的start函数,就可以开始爬取图片了。

crawler.start('美食', 10, 2, 30) 

最后:

在实际的爬虫中,我们经常会发送请求后加一个延时,这样既可以减轻服务器的压力,也可以避免请求频率过高被服务器识别,毕竟,我们的目的是爬取数据,而不是要把对方的服务器搞崩。

作者|齐

编辑|齐

感谢大家观看

有钱的老板可打赏一下小编哦

扫描二维码

关注我们

QQ群:729683466

◰  

参考来源

代码作者:kong36088

参考链接:https://github.com/kong36088/BaiduImageSpider


转载:https://blog.csdn.net/qq_42680814/article/details/109975209
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场