Python爬虫小白入门——urllib库初探

一、什么是爬虫

说到爬虫,我们先说一下互联网,互联网是由很多的站点和网络设备组成的网络,网络上存储着各种各样的数据,我们平时上网的过程就是访问网络上的各种资源的过程,首先我们要知道我们需要访问的网络的地址,然后在浏览器地址栏内输入,通过浏览器我们告诉网站:“准备好了吗?我要上你了!”,然后网站会回应我们:“来呀来呀!来上我呀!”,网站就给我们返回了一堆代码和数据,通过浏览器翻译(解析)给我们,呈现在我们面前的就是我们看到的网页。

爬虫就相当于我们在这个网络上放了一个虫子,模拟我们用户访问网络的方式去访问网络上的资源,这个虫子在网络里爬来爬去,把所有我们需要的数据(HTML、json、图片、音频、视频等)抓到,然后保存到我们本地。

二、爬虫的步骤

爬取一个网站需要哪些步骤

1、要爬取一个网站,首先我们要有这个网站的url,不然你爬谁呢?

2、模拟用户给服务器发送网络请求,告诉他你要上他了

3、接收服务器响应,服务器返回数据

4、解析数据

5、数据持久化

接下来我们就使用Python来按照这些步骤去实现。

三、urllib库01

要做爬虫,urllib库是必须要知道的,它是Python自带的标准库,urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应,学习这个标准库,可以更加深入的理解后面更加便利的requests库,也算是爬虫前期的一个扫盲。

首先是写一个最简单的例子

#我们要使用urllib当然要导入urllib这个库了,这里我们使用到的是request
import urllib.request

#导完了开干吧,按照我们上面说的几个步骤来
#这里涉及到的api我们待会会单独拿出来说,现在只是先走通步骤

#1.首先我们要有我们要爬取的网站的url吧,这里我们以百度为例
my_url = "http://www.baidu.com"

#2.模拟用户给服务器发送网络请求,使用到的api是urlopen
#这个api还会返回给我们一个对象,我们需要用个变量去接收他
#3.我们通过这个api也就接收到了服务器的响应
my_response = urllib.request.urlopen(my_url)

#4.解析数据,同样用一个变量去承接解析结果
my_data = my_response.read()

#5.数据持久化(保存到本地),这里直接保存到根目录下
with open("baidu_test01.html","wb")as f:
    f.write(my_data)

是的,就是这么简单,这个时候我们会看到生成了一个baidu_test01.html的文件,我们使用浏览器打开它

Python爬虫小白入门——urllib库初探

这个时候我们已经完成了一个最简单的爬虫,接下来我们来看一下使用到的api

1.发送网络请求:urlopen() 

先简单了解一波这个api,这里之说我们用到的部分,先按住Ctrl点开这个api看一下底层

Python爬虫小白入门——urllib库初探

我们看到这个api里有很多的参数,我们暂且不用管它,我们首先看到官方对这个api的描述,“Open the URL url, which can be either a String or a Request object” ——“打开URL类型的url,它可以是一个字符串或是一个Request对象”,我们这里用到的是打开的一个url字符串,后者Request对象我们后面会用到。所以到这里我们知道了,urllib.request.urlopen()这个函数就是用来打开一个URL的,也就是发送网络请求的。

2.接收服务器响应:

我们这里接收服务器响应也是在urlopen这个过程中完成的,可以看一下官方的注释

Python爬虫小白入门——urllib库初探

 划红线的部分告诉我们:对于HTTP和HTTPS的url,该函数返回http .client. HTTPResponse对象,这个对象里就包含了服务器给我们的响应。所以在例子里我们使用了一个变量my_response去承接urlopen的返回值,也就是HTTPResponse对象,也就是服务器给我们返回来的数据。

3.解析数据:

我们现在已经得到了响应对象,但是并不是我们想看到的东西,我们现在需要把它转换成我们能看懂的东西,所以HTTPResponse对象提供了read()方法,这里的read()使用方法和文件对象是一样的。HTTPResponse对象还提供了以下一些方法,这里可以简单了解一下:

urlopen返回对象提供方法:

-         read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样

-         info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息

-         getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到

-         geturl():返回请求的url

解析之后我们可以把解析的结果用一个变量my_data去承接一下,我们也可以打印出来这个解析结果看一下:

Python爬虫小白入门——urllib库初探

打印出来这么一堆鬼东西,乱七八糟中我们看到开头一个熟悉的身影——html,所以这应该就是一个静态页面.....

4.数据持久化

既然解析到了是html页面,那我们就保存为一个html文件就可以了,注意,我们这里解析得到的是

Python爬虫小白入门——urllib库初探

所以我们写入的时候要以"wb"模式写入,现在所有的事情都已经做完了,打开我们生成的html文件就看到了我们熟悉的百度页面啦

(未完待续)