Python3之urllib库的使⽤总结
Urllib库是Python中的⼀个功能强⼤、⽤于操作URL,并在做爬⾍的时候经常要⽤到的库。在Python2.x中,分为Urllib库和Urllib2
库,Python3.x之后都合并到Urllib库中,使⽤⽅法稍有不同。本⽂介绍的是Python3中的urllib库。
什么是Urllib库
Urllib是Python提供的⼀个⽤于操作URL的模块,我们爬取⽹页的时候,经常需要⽤到这个库。
升级合并后,模块中的包的位置变化的地⽅较多。在此,列举⼀些常见的位置变动,⽅便之前⽤Python2.x的朋友在使⽤Python3.x的时候可以快速掌握。
常见的变化有:
在Pytho2.x中使⽤import urllib2-------对应的,在Python3.x中会使⽤quest,。
在Pytho2.x中使⽤import urllib-------对应的,在Python3.x中会使⽤quest,,urllib.parse。
在Pytho2.x中使⽤import urlparse-------对应的,在Python3.x中会使⽤import urllib.parse。
在Pytho2.x中使⽤import urlopen-------对应的,在Python3.x中会使⽤quest.urlopen。
在Pytho2.x中使⽤import urlencode-------对应的,在Python3.x中会使⽤import urllib.parse.urlencode。
在Pytho2.x中使⽤import urllib.quote-------对应的,在Python3.x中会使⽤quest.quote。
在Pytho2.x中使⽤cookielib.CookieJar-------对应的,在Python3.x中会使⽤http.CookieJar。
在Pytho2.x中使⽤urllib2.Request-------对应的,在Python3.x中会使⽤quest.Request。
快速使⽤Urllib爬取⽹页
以上我们对Urllib库做了简单的介绍,接下来讲解如何使⽤Urllib快速爬取⼀个⽹页。
⾸先需要导⼊⽤到的模块:quest
quest
1
在导⼊了模块之后,我们需要使⽤quest.urlopen打开并爬取⼀个⽹页,此时,可以输⼊如下代码爬取百度⾸页(),爬取后,将爬取的⽹页赋给了变量file:
>>>quest.urlopen('www.baidu')
1
此时,我们还需要将对应的⽹页内容读取出来,可以使⽤ad()读取全部内容,或者也可以使⽤adline()读取⼀⾏内容。
>>>ad()    #读取全部
>>>adline()    #读取⼀⾏内容
读取内容常见的有3种⽅式,其⽤法是:
1. read()读取⽂件的全部内容,与readlines()不同的是,read()会把读取到的内容赋给⼀个字符串变量。
2. readlines()读取⽂件的全部内容,readlines()会把读取到的内容赋值给⼀个列表变量。
3. readline()读取⽂件的⼀⾏内容。
此时,我们已经成功实现了⼀个⽹页的爬取,那么我们如何将爬取的⽹页以⽹页的形式保存在本地呢?
思路如下:
1. 爬取⼀个⽹页并将爬取到的内容读取出来赋给⼀个变量。
2. 以写⼊的⽅式打开⼀个本地⽂件,命名为*.html等⽹页格式。
3. 将步骤1中的变量写⼊该⽂件中。
4. 关闭该⽂件
我们刚才已经成功获取到了百度⾸页的内容并读取赋给了变量data,接下来,可以通过以下代码实现将爬取到的⽹页保存在本地。
>>>fhandle=open("./1.html","wb")
>>>fhandle.write(data)
>>>fhandle.close()
此时,1.html已窜在我们指定的⽬录下,⽤浏览器打开该⽂件,就可以看到我们爬取的⽹页界⾯。
除此之外,urllib中还有⼀些常见的⽤法。
如果希望返回与当前环境有关的信息,我们可以使⽤info()返回,⽐如可以执⾏:
>>>file.info()
<http.client.HTTPMessage object at 0x0000000003623D68>
可以看到,输出了对应的info,调⽤格式则为:“()”,我们之前爬取到的⽹页赋给了变量file,所以此时通过file调⽤。
如果我们希望获取当前爬取⽹页的状态码,我们可以使⽤getcode(),若返回200为正确,返回其他则不正确。在该例中,我们可以执⾏:
>>&de()
200
如果想要获取当前所爬取的URL地址,我们可以使⽤geturl()来实现。
>>&url()
'www.baidu'
⼀般来说,URL标准中只会允许⼀部分ASCII字符⽐如数字、字母、部分符号等,⽽其他的⼀些字符,⽐如汉字等,是不符合URL标准的。此时,我们需要编码。
如果要进⾏编码,我们可以使⽤quest.quote()进⾏,⽐如,我们如果要对百度⽹址进⾏编码:
>>&quest.quote('www.baidu')
'http%3A//www.baidu'
那么相应的,有时候需要对编码的⽹址进⾏解码
>>&quest.unquote('http%3A//www.baidu') 'www.baidu'
浏览器的模拟—Headers属性
有的时候,我们⽆法爬取⼀些⽹页,会出现403错误,因为这些⽹页为了防⽌别⼈恶意采集其信息所以进⾏了⼀些反爬⾍的设置。
url编码和utf8区别那么如果我们向爬取这些⽹页的信息,应该怎么办呢?
可以设置⼀些Headers信息,模拟成浏览器去访问这些⽹站,此时,就能够解决这个问题了。
那我们该添加什么头部信息呢?
我们需要让爬⾍模拟成浏览器,模拟成浏览器可以设置User-Agent信息。
任意打开⼀个⽹页,⽐如打开百度。然后按F12,会出现⼀个窗⼝。切换到Network标签页:
然后单击⽹页中的“百度⼀下”,即让⽹页发⽣⼀个动作。
此时,我们可以观察到下⽅的窗⼝出现了⼀些数据。将界⾯右上⽅的标签切换到“Headers”中,即可以看到了对应的头信息,此时往下拖动,就可以到User-Agent字样的⼀串信息。这⼀串信息即是我们下⾯模拟浏览器所需要⽤到的信息。我们将其复制出来。如图:
我们可以得到该信息:
User-Agent:Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
X-Requested-With:XMLHttpRequest
接下来,我们讲解如何让爬⾍模拟成浏览器访问页⾯的设置⽅法。
quest
import urllib.parse
url='www.baidu'
hearder={
'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
quest.Request(url,headers=header)
quest.urlopen(request).read()
fhandle=open("./1.html","wb")
fhandle.write(reponse)
fhandle.close()
⾸先,设置要爬取的⽹址,然后调⽤quest.Request()函数创建⼀个request对象,该函数第⼀个参数传⼊url,第⼆个参数可以传⼊数据,默认是传⼊0数据,第三个参数是传⼊头部,该参数也是有默认值的,默认是不传任何头部。
我们需要创建⼀个dict,将头部信息以键值对的形式存⼊到dict对象中,然后将该dict对象传⼊quest.Request()函数第三个参数。
此时,已经成功设置好报头,然后我们使⽤urlopen()打开该Request对象即可打开对应的⽹址。
超时设置
有的时候,我们访问⼀个⽹页,如果该⽹页长时间未响应,那么系统就会判断该⽹页超时了,即⽆法打开该⽹页。
有的时候,我们需要根据⾃⼰的需要来设置超时的时间值。我们可以在quest.urlopen()打开⽹址的时候,通过timeout字段设置。设置格式为:quest.urlopen(要打开的⽹址,timeout=时间值)。
HTTP协议请求实战
如果要进⾏客户端与服务器端之间的消息传递,我们可以使⽤HTTP协议请求进⾏。
HTTP协议请求主要分为6种类型,各类型的主要作⽤如下:
GET请求:GET请求会通过URL⽹址传递信息,可以直接在URL中写上要传递的信息,也可以由表单进⾏传递。如果使⽤表单进⾏传递,这表单中的信息会⾃动转为URL地址中的数据,通过URL地址传递。
POST请求:可以向服务器提交数据,是⼀种⽐较主流也⽐较安全的数据传递⽅式,⽐如在登录时,经常使⽤POST请求发送数据。
PUT请求:请求服务器存储⼀个资源,通常要指定存储的位置。
DELETE请求:请求服务器删除⼀个资源。
HEAD请求:请求获取对应的HTTP报头信息。
OPTIONS请求:可以获取当前URL所⽀持的请求类型。
除此之外,还有TRACE请求与CONNECT请求等。
接下来,将通过实例讲解HTTP协议请求中的GET请求和POST请求,这两种请求相对来说⽤的最多。
GET请求⽰例分析