获取某个网页
import requests
r = requests. get('https://www.baidu.com/')
print(type(r))
print(r. status_code)
print (type(r. text))
print(r. text)
print(r.cookies)
各种请求
# 发送一个 HTTP POST 请求:
r = requests.post("http://httpbin.org/post",
data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
# 发送一个 HTTP delete 请求:
r = requests.head('http://httpbin.org/get')
# 发送一个 HTTP head 请求:
r = requests.options('http://httpbin.org/get')
# 发送一个 HTTP options 请求:
构造get请求传递参数
对于 GET 请求,利用 params 这个参数
import requests
data={
"key1":"value1",
"key2":"value2"}
r = requests.get('http://httpbin.org/get', params=data)
print(r.url)
#http://httpbin.org/get?key1=value1&key2=value2
还可以将一个列表作为值传入
import requests
data={
"key1":"value1",
"key2":["value2","value3"]}
r = requests.get('http://httpbin.org/get', params=data)
print(r.url)
#http://httpbin.org/get?key1=value1&key2=value2&key2=value3
注意:字典里值为 None 的键都不会被添加到 URL 的查询字符串里。
另外,网页的返回类型实际上是str类型,但是它很特殊,是 JSON 格式的。 所以,如果想直接解析返回结果,得到一个字典格式的话,可以直接调用 json()方法。 示例如下:
import requests
r = requests.get('http://httpbin.org/get')
print(r.json())
'''
{'args': {},
'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.23.0', 'X-Amzn-Trace-Id': 'Root=1-5e9b0b15-4d6629f8460bc48037fa4244'}, 'origin': '124.164.123.240', 'url': 'http://httpbin.org/get'}
'''
抓取网页
以知乎-新闻页为例,需要构造请求头header。可以在开发者工具中找到。
import requests
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0'
}
r = requests.get("https://daily.zhihu.com/",headers=headers)
print(r.text)
当然,我们可以在 headers 这个参数中任意添加其他的字段信息。
抓取二进制数据
在上面的例子中,我们抓取的是知乎的一个页面, 实际上它返回的是一个 HTML 文档。 如果想抓图片、音频、 视频等文件,应该怎么办呢?
图片、音频、视频这些文件本质上都是由二进制码组成的,由于有特定的保存格式和对应的解析方式, 我们才可以看到这些形形色色的多媒体。 所以,想要抓取它们,就要拿到它们的二进制码。
import requests
r = requests.get("https://github.com/favicon.ico")
with open("favicon.jpg","wb") as f:
f.write(r.content)
这里用了 open ()方法,它的第一个参数是文件名称,第二个参数代表以二进制写的形式打开,可以向文件里写入二进制数据。 运行结束之后,可以发现在文件夹中出现了名为 favicon.ico 的图标。
在此构建循环语句即可不断抓取数据。
POST请求
import requests
data ={'name ':'germey', 'age':'22'}
r = requests.post("http://httpbin.org/post", data=data)
print(r.text)
#部分输出:
# "form": {
# "age": "22",
# "name ": "germey"
#}
form 部分就是提交的数据,这就证明 POST请求成功发送了。
响应
发送请求后,得到的自然就是响应。 在上面的实例中,我们使用 text 和 content 获取了响应的内容。 此外,还有很多属性和方法可以用来获取其他信息,比如状态码、响应头、 Cookies 等。
import requests
r = requests.get('http://www.baidu.com')
print(type(r.status_code), r.status_code)
print(type(r.headers), r.headers)
print ( type(r.cookies), r.cookies)
print(type(r. url), r. url)
print(type(r.history), r.history)
这里分别打印输出 status_code 属性得到状态码,输出 headers 属性得到响应头,输出cookies 属性得到 Cookies,输出 url 属性得到 URL,输出 history 属性得到请求历史。
文件上传
import requests
files = {'file' : open ('favicon.ico','rb')}
r = requests.post('http://httpbin.org/post', files=files)
print(r.text)
需要注意的是, favicon.ico 需要和当前脚本在同一 目录下。 如果有其他文件,当然也可以使用其他文件来上传,更改 下代码即可。
这个网站会返回响应,里面包含 files 这个字段,而 form 字段是空的,这证 明文件上传部分会单独有一个 files 字段来标识。
Cookies
先看获取Cookies
import requests
r = requests.get('https://www.baidu.com')
print(r.cookies)
for key,value in r.cookies.items():
print(key + '=' + value)
#<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
#BDORZ=27315
这里我们首先调用 Cookies 属性即可成功得到 Cookies, 可以发现它是 RequestCookieJar 类型。 然后用 items()方法将其转化为元组组成的列表, 遍历输出每一个 Cookie 的名称和值, 实现 Cookie 的遍历解析。
我们也可以直接用 Cookie 来维持登录状态, 下面以知乎为例来说明。
import requests
header={
'Host':'www.zhihu.com',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0',
'Cookie':'_zap=4f14e95a-0cea-4c5e-b2f7-45cfd43f9809; d_c0="AJCZtnMxyBCPTgURbVjB11p6-JAwsTtJB4E=|1581092643"; _xsrf=VaBV0QQwGFjz01Q9n2AmjAilhHrJXypa; tst=h; q_c1=516c72a5ff954c66b6563ff42e63387d|1585814979000|1582104705000; tshl=; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1587179989,1587216876,1587216886,1587267050; capsion_ticket="2|1:0|10:1587267052|14:capsion_ticket|44:YTUwMDY3MGYyNmJlNDU0ZTgxNjlhNjMwNWNkYzAxNmQ=|7b8a5ebd3649fb076617379e734a79cd7ef54d1242ddd1841aba6844c9d14727"; l_cap_id="YjJiNjc1MzY0ZmEzNGNlYjlkYThkODEyYmEzOWRiOTk=|1587222516|5a01a93ea68209c1116647750ed2131efa309a3d"; r_cap_id="N2EwMjY0N2NlNTM1NGZlMjliNGNhMGJmOTkyMDc1OTE=|1587222516|238b677c781f1ef90a7ad343d6cdd3871aff3269"; cap_id="OTVhNjZiMDQ3MDkzNGVjY2I5ZTUyNTlhOTcxNzk3Njg=|1587222516|6dd1ed77526aa949bccd4146ef218d8164804a6e"; KLBRSID=031b5396d5ab406499e2ac6fe1bb1a43|1587267062|1587267049; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1587267062; SESSIONID=wopWDVALc4X3RJObFrIWNChoNDJpogYSdBPicuRm7vV; JOID=WlgXBkLsoG-SjPrGduF5tDN1xettk80YycmkhT2OnDWm0rGBFgxg_8GF8MN9HDmwsdmzwZheWKVLuonghNnDleo=; osd=V1gXB0vhoG-ThffGduBwuTN1xOJgk80ZwMSkhTyHkTWm07iMFgxh9syF8MJ0ETmwsNC-wZhfUahLuojpidnDlOM=; z_c0="2|1:0|10:1587267060|4:z_c0|92:Mi4xT2JORUJnQUFBQUFBa0ptMmN6SElFQ1lBQUFCZ0FsVk45Qk9KWHdEa0NUcXVheUJDdnJtRzRUVEFHNjFqQThvd013|bb30373e1f13c8b751a3ffc09e8ab4c98780350f77989d93b20be7eb3a0b2fad"'
}
r = requests.get('https://www.zhihu.com/hot',headers=header)
print(r.text)
结果中包含了登录后的结果,当然,你也可以通过 cookies 参数来设置,不过这样就需要构造 RequestsCookieJar 对象,而且需 要分割一下 cookies。这相对烦琐
会话维持
在 requests 中,如果直接利用 get()或 post()等方法的确可以做到模拟网页的请求,但是这实际 上是相当于不同的会话,也就是说相当于你用了两个浏览器打开了不同的页面。
其实解决这个问题的主要方法就是维持同一个会话, 也就是相当于打开一个新的浏览器选项 卡而不是新开一个浏览器。 但是我又不想每次设置 cookies ,那该怎么办呢?这时候就有了新的 利器——Session 对象。
import requests
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)
#{
# "cookies": {
# "number": "123456789" }}
利用 Session ,可以做到模拟同一个会话而不用担心Cookies 的问题。 它通常用于模拟登录 成功之后再进行下一步的操作。
SLL证书验证
此外, requests 还提供了证书验证的功能。 当发送 HTTP 请求的时候,它会检查 SSL 证书,我们 可以使用 verify 参数控制是否检查此证书。 其实如果不加 verify 参数的话,默认是 True,会自动验证。
比如12306的网站,没有被官方CA,信任。
import requests
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
代理设置
为了防止多次访问后弹出验证码,或者跳转到登录认证页面的情况发生,我们需要设置代理来解决这个问题,这就需要用到 proxies 参数。 可以用这样的方式设置:
import requests
proxies = { 'http':'http:10 .10.1.10:3128',
'http':'http: //10.10.1.10: 1080', }
requests.get('https://www.taobao.com', proxies=proxies)
#代理无效,请换用自己的代理
requests 还支持 SOCKS 协议的代理。
超时设置
在本机网络状况不好或者服务器网络响应太慢甚至无响应时,我们可能会等待特别久的时间才可 能收到响应,甚至到最后收不到响应而报错。 为了防止服务器不能及时响应,应该设置一个超时时间, 即超过了这个时间还没有得到响应,那就报错。 这需要用到 timeout 参数。 这个时间的计算是发送请求到服务器返回响应的时间。 示例如下:
import requests
r=requests.get('https://www.taobao.com', timeout=1)
print(r.status_code)
如果想永久等待,可以直接将 timeout 设置为 None,或者不设置直接留空,因为默认是 None。
身份验证
requests 提供了一个简单的写法,可以直接传一个元组,它会默认使用 HTTPBasicAuth 这个类来认证。
import requests
r = requests.get('https://localhost:5000',
auth=(' username',' password'))
requests 还提供了其他认证方式,如 OAuth 认证。