【Python爬虫】requests与urllib库的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_37967865/article/details/85392207

我们在使用python爬虫时,需要模拟发起网络请求,主要用到的库有requests库和python内置的urllib库,一般建议使用requests,它是对urllib的再次封装,它们使用的主要区别:
requests可以直接构建常用的get和post请求并发起,urllib一般要先构建get或者post请求,然后再发起请求。

import requests

Response_get = requests.get(url, params=None, **kwargs)
Response_post = requests.post(url, data=None, json=None, **kwargs)

上面请求后得到的是requests.models.Response对象,需要处理后才能得到我们需要的信息
Response_get.text 得到的是str类型
Response_get.content 得到的是bytes类型,需要进行解码Response_get.content.decode(),相当于Response_get.text
Response_get.json() 得到的是JSON数据类型

一般我们最简单的get请求是requests.get(url),但是我们可以对请求进行定制,比如requests.get(url,headers=headers)
headers里面可以定制User-Agent和cookie
简单的post请求是requests.post(url),我们也可以requests.post(url,data),其中data可以是列表,字典,JSON等类型

import urllib.request

req = urllib.request.Request(self, url, data=None, headers={},origin_req_host=None,unverifiable=False,method=None)
Response_request = urllib.request.urlopen(req)
Response = urllib.request.urlopen(url, data=None, timeout=1, cafile=None, capath=None, cadefault=False, context=None)

urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程。
# 同时它还带有处理 authenticaton (授权验证), redirections (重定向), cookies (浏览器Cookies)以及其它内容。
# context 参数,它必须是 ssl.SSLContext 类型,用来指定 SSL 设置。cafile 和 capath 两个参数是指定CA证书和它的路径,这个在请求 HTTPS 链接时会有用。
# cadefault 参数现在已经弃用了,默认为 False 。
# 它是一个 HTTPResposne 类型的对象,它主要包含的方法有 read() 、 readinto() 、getheader(name) 、 getheaders() 、 fileno() 等函数
# 和 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性。 得到这个对象之后,赋值为 response ,
# 然后就可以用 response 调用这些方法和属性,得到返回结果的一系列信息。
# 例如 response.read() 就可以得到返回的网页内容, response.status 就可以得到返回结果的状态码,如200代表请求成功,404代表网页未找到等。

简单的get请求是urllib.request.urlopen(url),其中url可以是一个链接,也可以是一个请求,
所以我们定制请求头需要通过urllib.request.Request(url,headers=headers)进行定制,然后当成url传入到request.urlopen()

下面是两个库的简单使用方法:

import requests
import urllib.request


url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
api ='http://open.iciba.com/dsapi/'
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'
    }
form_data = {
    "i": "word",
    "from": "AUTO",
    "to": "AUTO",
    "smartresult": "dict",
    "doctype": "json",
    "version": "2.1",
    "keyfrom": "fanyi.web",
    "action": "FY_BY_REALTIME",
    "typoResult": "false"
}


req1 = requests.get(url,headers=headers)
req_api = requests.get(api,headers=headers)
print(type(req1),type(req1.text),req1.text)              # requests.get().text是str类型
print("字符串",type(req1.content),req1.content)           # requests.get().content是bytes类型
print("与直接req1.text一致",req1.content.decode())
print("接口返回json格式",req_api.json())                  # 接口返回格式需要用requests.get().json()


# POST发送的data必须为bytes或bytes类型的可迭代对象,不能是字符串
form_data = urllib.parse.urlencode(form_data).encode()
# urllib.request.Request()只是一个请求:
req2 = urllib.request.Request(url,data=form_data,headers=headers)
print(type(req2))


req3 = urllib.request.urlopen(url)      # 不可以伪装你的User Agent,可以通过urllib.request.Request()伪装
print(type(req3),req3.status)           # http.client.HTTPResponse
print(req3.getheaders())                # 响应的信息集合
print(req3.read().decode("utf-8"))      # urllib.request.urlopen().read().decode("utf-8")相当于requests.get().text

req4 = urllib.request.urlopen(req2)     # 参数可以直接是一个请求
print("直接一个请求:",req4.read().decode("utf-8"))

猜你喜欢

转载自blog.csdn.net/sinat_37967865/article/details/85392207