python 爬虫基础之urllib 库详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunshunli/article/details/79950445
一:爬虫的基本流程:
发起请求,即发送一个request,请求可以包含额外的信息,等待服务器的响应
获取响应的内容,所获取的页面的内容类型可能有HTML,json或者二进制数据
解析响应的内容,如果是HTML可以用正则表达式来解析,或者用解析库来解析,json类型可以转换为json对象解析。
保存数据,文本或者数据库

二:请求网站的一些库

1.

(1):urllib库(python中内置的HTTP请求库),其中urllib库在python2 和python3中是有区别的。
在urllib库中,主要有四个方法:
urllib.request这是在python3 中的表示方法,在python2中是urllib.open,作用是发送request请求和获取request的结果{是最基本的请求库}
urllib.error:"异常处理模块"
urllib.parse:"URL解析模块"

urilib.robotparser:"robots.txt解析莫莫模块"

(2):urllib库中的一些方法的代码实例

#urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
#这个是urllib.request.urlopen函数的参数。
import urllib.request
response=urllib.request.urlopen("http://www.baidu.com")#这是get请求,就一个url参数。
print(type(response))
print(response.getheader("Date"))#函数的作用是返回请求数据的response headers中的数据,数据是字典的格式,输入键值可以获得其中的值。
print(response.getheaders())#这个不用输入键值可以获取所有的respon headers数据。
print(response.status)#返回的是状态码。
print(response.read().decode('utf-8'))
#<class 'http.client.HTTPResponse'>这个是response的类型。它主要包含的方法有
# read() 、 readinto() 、getheader(name) 、 getheaders() 、 fileno() 等函数和
#  msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性

(3):上一步中参数只有一个url,但我们发现其实参数还有好多,但常用的是前三个,我们还可以传递其它的内容,比如 data (附加参数), timeout (超时时间)等等。

data 参数是可选的,如果要添加 data ,它要是字节流编码格式的内容,即 bytes 类型,通过 bytes() 函数可以进行转化,另外如果你传递了这个 data 参数,它的请求方式就不再是 GET 方式请求,而是 POST 。

import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read())
在这里我们传递了一个参数 word ,值是 hello 。它需要被转码成 bytes (字节流)类型。其中转字节流采用了 bytes() 方法,第一个参数需要是 str (字符串)类型,需要用 urllib.parse.urlencode() 方法来将参数字典转化为字符串。第二个参数指定编码格式,在这里指定为 utf8 。
提交的网址是 httpbin.org ,它可以提供 HTTP 请求测试。 http://httpbin.org/post 这个地址可以用来测试 POST 请求,它可以输出请求和响应信息,其中就包含我们传递的 data 参数

(4):timeout方法

import urllib.request
response = urllib.request.urlopen('http://httpbin.org', timeout=0.1)
print(response.read())
#urllib.error.URLError: <urlopen error timed out>报错了时间超时了.

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')

这个是用异常处理来体现timeout方法的.在这里我们请求了 http://httpbin.org/get 这个测试链接,设置了超时时间是0.1秒,然后捕获了 urllib.error.URLError 这个异常,然后判断异常原因是超时异常,就得出它确实是因为超时而报错,打印输出了 TIME OUT .

2.

urllib.request.Request的使用。

由上我们知道利用 urlopen() 方法可以实现最基本的请求发起,但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入 headers 等信息,我们就可以利用更强大的 Request 类来构建一个请求。


首先我们用一个实例来感受一下 Request 的用法:

import urllib.request
request=urllib.request.Request("http://www.baidu.com")
response=urllib.request.urlopen(request)
print(response.read().decode("utf-8"))
#其实这个方法的结果和之前的直接用urlopen的结果是一样的。

可以发现,我们依然是用 urlopen() 方法来发送这个请求,只不过这次 urlopen() 方法的参数不再是一个URL,而是一个 Request ,通过构造这个这个数据结构,一方面我们可以将请求独立成一个对象,另一方面可配置参数更加
丰富和灵活。

下面我们看一下 Request 它的一些参数

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None

其中url是必须选的,其余都是可选的。

data 参数如果要传必须传 bytes (字节流)类型的,如果是一个字典,可以先用 urllib.parse.urlencode() 编码。
headers 参数是一个字典,你可以在构造 Request 时通过 headers 参数传递,也可以通过调用 Request 对象的 add_header() 方法来添加请求头。请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-
Agent 是 Python-urllib ,你可以通过修改它来伪装浏览器,比如要伪装火狐浏览器,你可以把它设置为 Mozilla/5.0 (X11; U; Linux i686)Gecko/20071127 Firefox/2.0.0.11
origin_req_host 指的是请求方的 host 名称或者 IP 地址。
unverifiable 指的是这个请求是否是无法验证的,默认是 False 。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True 。

method 是一个字符串,它用来指示请求使用的方法,比如 GET , POST , PUT 等等。

下面举一个例子理解一下:

import urllib.request
import urllib.parse
url="http://httpbin.org/post"
dict={"name":"Mrsun"}
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
header={'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    "host":'httpbin.org'}
request=urllib.request.Request(url=url,headers=header,data=data,method="POST")
response=urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

运行结果:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "word": "hello"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Connection": "close", 
    "Content-Length": "10", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"
  }, 
  "json": null, 
  "origin": "222.173.104.238", 
  "url": "http://httpbin.org/post"
}
你会发现我们把一些成功的设置了header和data,method等参数。



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页