接下来我们要构造一个URL的链接,这个链接包含我们要搜索的关键词。这时候大家应该记得曾经我们讲过一个参数叫params,他可以向URL增加相关的内容,为了使用它我们首先构造一个键值对。这个键值对表明了我们要搜索的关键词是什么。这里面我们假设我们搜索的关键词是python。接下来我们用requests.get()函数来获取相关的内容。这个时候我们通过params将键值对输入进去。并且获得相关的请求。下面我们看一下status.code,这个时候状态码是200说明我们的请求已经被提交了。那这里我们的使用道理是什么呢?那我们可以看一下请求给百度的URL是什么,我们可以使用respons对象中包含的requests对象信息。
![](https://img.haomeiwen.com/i12438528/5ca3aec6dead2781.png)
这里的r.request.url语句指的是发给百度的这个request他对应的是什么,我们看到这个时候URL已经是符合百度接口的URL。我们再对比之前我们输入的键值对,我们可以看到这个键值对中的wd表示的是搜索引擎的那个接口前的标识,而后边的值python就是我们要搜的关键词。那么我们返回的内容有多少呢?我们首先不要打印它,我们首先看看他的长度,我们提交了关键词后,返回的长度是”302829“,也就是302k左右的信息。那么至于说怎么从返回的信息中解析百度返回的这个链接以及返回的内容。那是我们下次要讲的内容。这里边我们先把前一部分获取百度关键词的信息的页面先讲解到这里。
下面给出百度搜索的全代码:
![](https://img.haomeiwen.com/i12438528/66f78008189d68ac.png)
这里面我们也使用代码框架try和except。360的搜索引擎和百度的搜索引擎很类似,这里就再做例子了。直接给出360搜索的全代码:
![](https://img.haomeiwen.com/i12438528/8145e21ba230fbc3.png)
可以看到这段代码和百度搜索的提交代码基本类似,所不同的是只将其中的键值对的键由wd变成了q。同学们可以把这两段代码拿去试一下,看看能不能从百度和360搜索中能获得什么样的信息。
Part18:网络的图片爬取和存储
下面讲解第四个例子,网络图片的爬取和存储。其实我们都有一些想法说能不能把我们看到的好看的网络图片存储下来。那么这个用程序怎么做呢?首先我们看一下网络上图片链接的格式。网络上的图片链接基本上都是这样一个格式:前面是一个URL后面是一个picture.jpg这样的一个结尾。比如说我们去找国家地理的网站,随便选取其中的一个图片,那么在一个web页面中我么发现一个图片并点击他的右键属性就能看到这个图片的真实地址。
![](https://img.haomeiwen.com/i12438528/ca46bb26ba657529.png)
以这个图片为例:
![](https://img.haomeiwen.com/i12438528/d5e42993da2d1f68.png)
我们看到他的图片地址是这样的一个格式:
![](https://img.haomeiwen.com/i12438528/4d75cec62a1698d3.png)
那么如果一个URL链接是以.jpg这样的结尾的,那就说明它是一个图片链接,而且它是一个文件。那么我们要用程序做的事情就是把这个图片自动的爬取并保存下来。好,我们打开IDLE来试试:首先import requests库,由于我们要保存一个图片,我们需要知道我们把图片保存到本机的什么位置,这里面我们假设我们把图片保存到D盘,保存为abc.jpg这样一个名字,但是这个名字我们后期会做相关的处理。下面我们给出我们查到的网络图片的地址:
![](https://img.haomeiwen.com/i12438528/1f304a66a48681e4.png)
然后我们来用get请求来捕获这个url(r = requests.get(url)),然后看返回的状态码(r.status-code),200说明这个时候r已经包含了返回的这个图片。下面我们要想的是怎样把图片存成一个文件,我们知道图片是一个二进制格式,那我们怎样把二进制格式保存为一个文件呢?这里面我们来用如下的代码来实现:
with open(path, 'wb') as f:
f.write(r.content)
![](https://img.haomeiwen.com/i12438528/9e22361a3faa1a57.png)
这段代码说明了一个含义:首先我们打开了一个文件,这个文件就是我们要存储的abc.jpg并且把他定义为一个文件标识符f。然后我们将返回的内容写到这个文件中。我们应该还记得respons对象返回的内容中r.content表示是内容的二进制形式,所以我们可以用f.write(r.content)将返回的二进制形式写到文件中,最后我们将文件关闭f.close()。
接下来我们去D盘看一下abc.jpg这个文件他是不是网上的这个文件。这里面我们给出图片爬取的全代码:
![](https://img.haomeiwen.com/i12438528/cdb0d6e6cded106f.png)
在这个全代码中,我们稍微做了一些修改,我们在想我们在获取一个图片的时候能不能用图片原来的名字存储在本地呢?实际上是可以的。只需要将url中最后的那个图片文件的名字截取下来作为我们本地目录的名字就可以了。这里面我们除了import requests库之外,还需要引入os库,这里面我们给出url链接,这时候定义一个根目录,我们把根目录定义为D盘的pics(D://pics//).然后我们将文件的路径标识为这个根目录+我们url链接的以“/”分割的最后一部分,其实这部分就是最后的jpg文件。这样我们的path这个变量包含的就是本地路径中的一个文件名称。而这个名称与网络文件名的最后一部分是相同的。接下来我们使用try和except框架来获取网络代码,第一部分我们用if判断当前的根目录是不是存在,如果根目录不存在,我们就要建立这样的一个目录。接下来我们判断这个文件是不是存在,如果当文件不存在的时候我们通过requests.get()方式从网上获取相关的文件。我们讲了这么多的例子,一直在强调代码的可靠和稳定。事实上从功能意义上讲,写出一个代码并没有什么神奇的,而在工程意义上来讲,写代码的可靠和稳定性,这是相当重要的。所以当我们在写代码的时候都要考虑它可能出现的问题,并能够对问题做相关的处理。
事实上处理图片爬取之外,网上由很多类似的url格式,比如说网上的一个视频、flash、动画等等,我们可以去修改这个代码,后去网上很多的不同的资源。那我们赶紧去找一个链接试试吧,能不能获取一个动画或者是一个视频,或者是其他的图片下来。
网友评论