Python爬虫_Requests

发出请求

首先导入Requests模块

import requests

现在,我们尝试获取一个网页

r = requests.get(‘https://api.github.com/events’)

现在,我们有一个名为 r 的 Requests 的对象。我们可以从这个对象获取我们需要的所有信息

接下来演示一下POST请求方式:

postdata = {‘key’ : ‘value’}
r = requests.post(‘https://passport.csdn.net/account/login’, data = postdata)

在URL中传递参数
你可能见过类似这样的URL:http://hhh2333.com/get?key=val&key2=val2,就是在网站后面紧跟着“?”,“?”后面还有参数。那么这样的GET请求在requests中可以这样写:

payloda = {“key1” : “value1”, “key2” : “value2”}
r = requests.get(“https://blog.csdn.net/UserPython”, params = payload)

你可以通过打印URL看到URL已经正确编码,问号自动添加

pirnt(r.url)
//https://blog.csdn.net/UserPython?hhh=2333&HHH=3332

import requests

payload = {"hhh" : "2333", "HHH" : "3332"}

r = requests.get("https://blog.csdn.net/UserPython", params = payload)

print(r.url)
"""
result: https://blog.csdn.net/UserPython?hhh=2333&HHH=3332
"""

响应内容

文本形式响应内容

import requests
r = requests.get(‘http://www.baidu.com’)
print(r.text)

其中r.text返回的是文本形式,当发出请求时,Requests会根据HTTP标头猜测网页编码格式进而解析文本。如果解析文本出现乱码,可以通过r.encoding查看使用什么编码格式解析,并进行更改

print(r.encoding)
// result:ISO-8859-1
r.encoding = "utf-8"

import requests

r = requests.get("http://www.baidu.com")

# 查看Requests使用什么编码格式解码,r.encoding返回的是根据HTTP头猜测的网页编码格式
print(r.encoding)
"""
result: ISO-8859-1
"""

# 自行查看源网页的编码格式为UTF-8所以要更改
r.encoding = "utf-8"

print(r.text)
"""
更正后,爬取的HTML网页没有乱码
"""

这种手动的方式略显笨拙,下面提供一种更加简便的方式:chardet,这是一个字符串/文件编码检测模块,使用chardet.detect()返回字典,其中encoding是源网页的编码格式,confidence是检测精确度,示例如下:

import requests
import chardet

r = requests.get("http://www.baidu.com")

print(chardet.detect(r.content))
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

r.encoding = chardet.detect(r.content)["encoding"]

print(r.text)

二进制响应内容

对于非文本请求,还可以以字节为单位访问响应正文

print(r.content)
//返回二进制内容

响应状态码

查看响应状态码

r = requests.get(“http://www.baidu.com”)
print(r.status_code)
//200

请求还附带内置状态码查找对象,以便于参考:

print(requests.codes.ok)
//200

import requests

r = requests.get("http://www.baidu.com")

if r.status_code == requests.codes.ok:
    # 获取响应码
    print(r.status_code)
    # 获取响应头
    print(r.headers)
    # 获取响应头中某个字段,推荐使用这种方式
    print(r.headers.get("content-type"))
    print(r.headers["content-type"]) # 不推荐使用
else:
    r.raise_for_status()

上述程序中,r.headers包含所有的响应头信息,可以通过get函数获取其中的某一个字段,也可以通过字典引用的方式获取字典值,但是不推荐,因为如果字段中没有这个字段,第二种方式会抛出异常,第一种方式会返回None。r.raise_for_status()是用来主动地产生一个异常,当响应码是4xx或5xx时,raise_for_status()函数会抛出异常,而响应码为200时,raise_for_status()函数返回None

请求头headers处理

在Requests的get函数中添加headers参数即可,如下所示:

import requests

user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/69.0.3497.100"

headers = {"User_Agent" : user_agent}

r = requests.get("http://www.baidu.com", headers = headers)

print(r.content.decode("utf-8"))

Cookie处理

如果响应中包含Cookie的值,可以如下方式获取Cookie字段的值

import requests

user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 "

headers = {"User_Agent" : "user_agent"}

r = requests.get("http://www.baidu.com", headers)

# 遍历出所有cookie字段的值
for cookie in r.cookies.keys():
    print(cookie + ":" + r.cookies.get(cookie))

自动处理Cookie

希望每次访问时,程序自动把Cookie的值带上,像浏览器一样。Requests提供了一个session的概念,在连续访问网页,处理登录跳转时特别方便,不需要关注具体细节

import requests

loginUrl = "http://www.hhh.com/login"

s = requests.Session()

#首先访问登录界面,作为游客,服务器会先分配一个cookie
r = s.get(loginUrl, allow_redirects = True)

datas = {"name" : "UserH", "passwd" : "UserH"}

# 向登录连接发送POST请求,验证成功,游客权限转为会员权限

r = s.post(loginUrl, data = datas, allow_redirects = True)

print(r.text)

上述程序,如果没有第一步访问登录的页面,而是直接向登录链接发送POST请求,系统会把你当做非法用户,因为访问登录界面时会分配一个cookie,需要将这个cookie在发送POST请求时带上,这种使用session函数处理Cookie的方式之后会很常用。

重定向与历史信息

重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置。重定向是网页制作中的一个知识,如:你现在所处的位置是一个论坛的登录页面,你填写了账号,密码,点击登录,如果你的账号密码正确,就自动跳转到论坛的首页,不正确就返回登录页;这里的自动跳转,就是重定向的意思。或者可以说,重定向就是在网页上设置一个约束条件,条件满足,就自动转入到其他网页、网址

处理重定向只是需要设置一下allow_redirects字段即可,例如r = requests.get(“http://www.baidu.com”, allow_redirects = True)。将allow_redirects设置为True,则是允许重定向;设置为False,则是禁止重定向,如果是允许重定向,可以通过r.history字段查看历史信息,即可访问成功之前的所有请求跳转信息

import requests

r = requests.get('http://github.com', allow_redirects=True)

print(r.url)
# // https://github.com/

print(r.status_code)
# // 200

print(r.history)
# // [<Response [301]>]

上面的示例代码显示的效果是访问GitHub网址时,会将所有的HTTP请求全部重定向到HTTPS

超时设置

超时选项是通过参数timeout来进行设置的。可以通过参数timeout告知请求在给定秒数后停止等待响应。几乎所有生产代码都应该在几乎所有请求中使用此参数。如果不这样做可能会导致程序无限期挂起。

requests.get( “http://github.com”, timeout = 2)

猜你喜欢

转载自blog.csdn.net/UserPython/article/details/83037620