零基础学Python爬取搜索引擎搜索的

中科治疗白癜风有疗效 https://mjbk.familydoctor.com.cn/bjbdfyy/pj/

大家都知道,提起Python,第一个联想到的可能是爬虫,也就是所谓的蜘蛛程序。当然,首先声明,本文中的爬虫仅仅供学习交流使用,不可用于商业和非法的目的。爬虫是一个听起来很神奇的东西,其实实现起来也很简单,在我的另外一个关于深度学习的专题里是专门有讲过爬虫程序的。

其实大家都知道搜索引擎也都是爬虫技术,主流的搜索引擎之所以速度快、效率高,主要是因为强大的集群计算系统和加速技术。所以其实搜索引擎并不难写,但是一款好的搜索引擎一定是需要心无旁骛的放在搜索本身上,一旦加入更多的商业化的东西,那么搜索本身就会被弱化了。好像有点离题,我们今天来讨论一下如何爬取图像。

一个简单的爬虫,我们可以分为三个部分。一是抓取网页信息;二是分离出我们需要的内容;三是将解析出来的内容进行处理。复杂一点的爬虫,还会涉及到一些键盘和鼠标事件的模拟。当然本文我们不讨论复杂的部分。

今天我们要讨论的是使用爬虫下载搜索引擎搜索到的图片,我们以某歌的搜索引擎为例来完成这个程序。其他的搜索引擎爬取方法也是大同小异,差异无非是在一些网页的结构上。由于我们的目的很明确,我们并不会去使用xml解析的包,因为没那个必要,甚至我们也没有用到正则表达式,因为某歌的搜索页面格式还是比较规整的。

我们先来看我们的大致流程,我们基本上可以分为:

一、抓取网页的数据。

二、解析出网页中的图片链接。

三、下载图片。

看起来也很简单清晰的对吗?没错,其实爬取图片是一件蛮简单的事情,尤其是使用Python的情况下。

下面我们来看代码的部分,照例我们需要import一些我们需要的包。这些包主要包括获取网页抓取的包和一些错误信息的包以及一些常用的包。

基本上,这部分没有太多需要赘述的。我们需要用到哪些包,我们就import哪些包就可以了。然后我们作为一个爬虫来说,必须是一个正儿八经的爬虫。这是什么意思呢?爬虫本质上是可以做很多事情,但是我们仅仅作为研究使用,不能用于别的用途。即便这样,我们是否能够直接就上一个request去爬取数据呢?这肯定是很多网站不允许的。我们必须将自己模拟为浏览器,然后我们再去爬取数据。有一些教程会告诉你,还需要使用代理。这里我们再来做一下科普什么是合法的爬虫,之前我们也有看到一些新闻会说某某公司非法爬取其它公司的数据被告,听起来不是那么的令人心安。那么什么样的爬虫是没有问题的呢?大概遵循这么几条:

一、我们爬取的内容是可以正常通过网页常规访问的。这里面常规很重要,其实有一些网页的数据可以通过一些非公开的地址来进行访问,这些其实是在一个边缘地带,我们尽量不要去爬取这些数据。

二、我们爬取的数据仅仅作为研究之用,并不用做商业用途。任何将爬取的数据用来盈利的行为都是不合法的。

三、我们的爬虫不会对服务器造成巨大的负担,不恶意去访问和爬取数据。事实上大型网站的服务器,一般的爬虫也是不会对它造成影响的,如果你的爬虫程序强大到能影响到一个门户网站,那么你基本上不需要玩这个爬虫程序了。刚才也讲到说代理,事实上稍微像样一点的网站都有反爬虫技术,异常的巨量访问会屏蔽你的地址。

我们来看一下,模拟浏览器需要什么?

在下面的代码中,我们可以看到实际使用的方法。接下来我们来看看我们的主要的代码。如下的代码中,我们可以看到我们用keyword定义了我们的搜索关键词,用count定义了想要下载的图片数。然后我们定义了下载的主路径,以及以关键词为名的子目录。并且我们按照这个名称去创建好文件路径,接下来我们就调用了download这个函数,那么其实大家看到基本上的功能实现都在这个函数里面了。

然后我们来看download这个函数,这个函数里我们定义了一个地址,这个地址大家注意将某歌替换为真实地址。然后我们调用了一个_get_pictures的函数,这个函数才是我们真正去获取网页信息的函数,这个函数接受三个参数,搜索网页的内容数据、图片的存储路径和图片的下载数量。

那么我们先来看看获取网页的内容数据的get_page(url)函数,然后我们再来看_get_pictures函数。get_page函数其实很简单,我们使用urllib的request去向网页提交一个请求,也就是我们的地址,这里大家可以看到我们使用了我们最开始定义的HEADERS。我们使用urlopen将网页的数据读取出来,并将其转换为字符串,用try…except可以避免错误终止我们的读取,也就是说它的意思是直到读取到为止。当然,大家如果直接去读取某歌,肯定是会返回错误的,需要科学上网。我们没有加上太多的错误判断,是为了简化我们的程序,并且这里出现读取错误的概率不大。

接下来,我们来看看_get_pictures这个函数。这个函数其实也很简单,我们可以看到里面有一个while循环,循环里面有一个名为_get_next_pictures的函数,其实这个函数也很简单,它的作用就是去寻找我们抓取到的网页数据里的下一个图片地址。每当我们找到一个图片地址的时候呢,会返回图片的地址、图片的格式和从这个图片信息结束的地方的索引。然后我们使用download_image函数download这张图片。大家可以看到我们的下载逻辑是我们一定要下载到我们指定数量的图片,而不仅仅说是试图下载指定数量的图片。其实某歌的一页是张图片,所以我们在测试这个程序的时候可以将数量定少一下,如果试图下载数量超过张,那么我们就要使用chrome的driver来进行完成了,这部分我们暂且不表。

接下来我们来看看_get_next_picture这个函数,这个函数里面其实大家可以看到谷歌的搜索界面还是蛮简单的,我们只需要用简单的find就可以搞定。这部分其实没有什么可以说的,大家只要把page的信息打印出来,就可以发现其中的规律。找到图片信息之后,其实是一个很规整的Json格式,load出来之后其实是一个标准的字典。

我们在这里稍稍带过一下format_object这个函数,这个函数其实也很简单。我们用Json的loads函数load出来的字典,我们仅仅只是用format_object进行一下名称的处理,然后传给download_image函数。

接下来我们来看看最后的download_image函数,我们前面已经找到了图像的地址和格式信息,事实上还有更多的信息,比如尺寸等等,我们本文中的代码主要为了保持间接性,都省略掉了。下载图像其实也很简单,用url的request去提交一个请求,然后去读取返回的图片数据,最后将数据写到文件中。中间我们有一些对图片路径进行处理的部分,也比较简单,就不多介绍了。

到这里我们的抓取某歌搜索结果图片的程序就结束了,大家可以试试。另外有一点要注意的是,本文的代码默认safesearch是关闭的。作为研究之用来说,在某歌上浏览某些图片是不好的,但是使用一个python程序下载下来好像就没有那么明目张胆了。最后声明一下,本文的程序仅供学习交流研究使用,不得用作任何非法和商业用途。




转载请注明:http://www.aierlanlan.com/rzfs/4295.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了