pyhton爬虫基础(六)urllib中的urlopen

学习爬虫,最初的操作便是模拟浏览器向服务器发出请求。

我们只需要关心请求的链接是什么,需要的参数是什么,以及如何设置可选的请求头就行了,不需要深入了解它是怎样传输和通信的。

一、使用urllib

它是Pyhton内置的HTTP请求库,包含四个模块。

request:它是最基本的HTTP请求模块,可以用来模拟发送请求。就像在浏览器里输入网址然后回车一样,只用给库方法传入URL以及额外的参数,就可以模拟实现这个过程。

error:异常处理模块。

parse:一个工具模块,提供了许多处理URL方法。如拆分、解析、合并等。

robotparser:主要用识别网站的robots.txt文件,判断网站是否能爬取,一般不用。

1.发送请求

使用urllib的request模块,我们可以方便地实现请求的发送并得到响应。下面是具体用法。

(1)urlopen()

urllib.request模块提供了最基本的构造HTTP请求的方法,它还带有处理授权验证、重定向、浏览器Cookies以及其他内容。

import urllib.request
resonse=urllib.request.urlopen('https://www.python.org')
print(resonse.read().decode('utf-8'))

只需两行代码就实现Python官网的抓取,输出了网页的源代码。得到源代码后,我们就可以从中提取链接、网图地址、文本信息。

接下来看看它返回的是啥,用type()方法输出响应类型:

import urllib.request
resonse=urllib.request.urlopen('https://www.python.org')
print(type(resonse))

输出结果如下:

可以发现它是一个HTTPResonse类型的对象,主要包含read()、readinto()、getheader(name)、getheaders()、fileno()等方法,以及msg、version、status、reason、debuglevel、closed等属性。

得到这个对象后,我们把它赋值为response变量,然后就可以调用这些方法和属性,得到返回结果的一系列信息了。

data参数

data参数是可选的。如果要添加bytes类型的内容,则需要通过bytes()方法转化。如传递了这个参数,则它的请求方式就不再是GET方式而是POST方式。

该方法第一个参数需要的是str类型,需要用urllib.parse模块里的urlencode()方法来将参数字典转化为字符串:第二个参数指定编码格式。

timeout参数

timeout参数用于设置超时时间,单位为秒,意思就是如果超出了设置的这个时间,还没有得到响应,就会抛出异常。如果不指定该参数,就会使用全局默认时间。支持HTTP、HTTPS、HTP请求

因此,可以通过设置这个超时时间来控制一个网页如果长时间未响应,就跳过它的抓取。这可以利用try except语句来实现,

import socket
import urllib.request
import urllib.error
try:
    response=urllib.request.urlopen('http://httpbin.org/get',timeout=0.1)
except urllib.error.URLError as e:
    if isinstance(e.reason, socket.timeout):
        print('TIME OUT')

 其他参数

context参数必须是ssl,SSLContext类型,用来指定SSL设置。

cafile和capath这俩参数分别指定CA证书和它的路径,这个在请求HTTPS链接时有用。

cadefault参数现在已经弃用了,其默认值为False。

更详细信息