安装
pip3 install requests
实例引入
urllib库中的urlopen方法实际上是以GET方法请求网页,requests库中相应的方法就是get方法。
示例1
import requestsr = requests.get('https://www.baidu.com/')
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.text[:100])
print(r.cookies)
对于requests库来说,不仅是get请求,其他类型的请求,依然可以用一句话来完成。
import requestsr = requests.get('https://www.httpbin.org/get')
r = requests.post('https://www.httpbin.org/post')
r = requests.put('https://www.httpbin.org/put')
r = requests.delete('https://www.httpbin.org/delete')
r = requests.patch('https://www.httpbin.org/patch')
GET请求
示例
一个简单的无参请求
import requestsr = requests.get('https://www.httpbin.org/get')
print(r.text)
- 结果如下:
{"args": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "www.httpbin.org", "User-Agent": "python-requests/2.32.3", "X-Amzn-Trace-Id": "Root=1-67a1bcff-67c413a82805784e0dee2199"}, "origin": "123.12.88.142", "url": "https://www.httpbin.org/get"
}
简单的带参请求
import requestsdata = {'name': 'zyc','age': 19,'city': 'shanghai'
}r = requests.get('https://www.httpbin.org/get', params=data)
print(r.text)
- 结果如下:
{"args": {"age": "19", "city": "shanghai", "name": "zyc"}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "www.httpbin.org", "User-Agent": "python-requests/2.32.3", "X-Amzn-Trace-Id": "Root=1-67a1bda4-6464dcc03a7428c229d63137"}, "origin": "123.12.88.142", "url": "https://www.httpbin.org/get?name=zyc&age=19&city=shanghai"
}
解析返回结果,得到一个JSON格式的数据
import requestsr = requests.get('https://www.httpbin.org/get')
print(type(r.text))
print(r.json())
print(type(r.json()))
- 结果如下:
<class 'str'>
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'www.httpbin.org', 'User-Agent': 'python-requests/2.32.3', 'X-Amzn-Trace-Id': 'Root=1-67a1bfdb-223cf88733acc9d0414fedc8'}, 'origin': '123.12.88.142', 'url': 'https://www.httpbin.org/get'}
<class 'dict'>
抓取网页
- 一个简单的例子
import requests
import rer = requests.get('https://ssr1.scrape.center/')
pattern = re.compile('<h2.*?>(.*?)</h2>', re.S)
titles = re.findall(pattern, r.text)
print(titles)
- 结果如下:
['霸王别姬 - Farewell My Concubine', '这个杀手不太冷 - Léon', '肖申克的救赎 - The Shawshank Redemption', '泰坦尼克号 - Titanic', '罗马假日 - Roman Holiday', '唐伯虎点秋香 - Flirting Scholar', '乱世佳人 - Gone with the Wind', '喜剧之王 - The King of Comedy', '楚门的世界 - The Truman Show', '狮子王 - The Lion King']
抓取二进制数据
图片、音频、视频这些文件本质上都是由二进制组成的,由于有特定的保存格式和对应的解析方式,我们才能看到这些形形色色的多媒体。
- 获取二进制数据
import requestsr = requests.get('https://scrape.center/favicon.ico')
print(r.text)
print(r.content)
- 保存二进制数据
import requestsr = requests.get('https://scrape.center/favicon.ico')
with open('favicon.ico', 'wb') as f:f.write(r.content)
这里用到了open方法,第一个参数是文件名称,第二个参数代表以二进制的形式打开文件,可以向文件里写入二进制数据。运行当前代码后,可以看到文件夹中出现了名为favicon.ico的图标。
POST请求
代码示例
import requestsdata = {'name': 'zyc', 'age': '19', 'city': 'shanghai'}
r = requests.post('https://httpbin.org/post', data=data)
print(r.text)
结果如下:
{"args": {}, "data": "", "files": {}, "form": {"age": "19", "city": "shanghai", "name": "zyc"}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "29", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.32.3", "X-Amzn-Trace-Id": "Root=1-67a2db76-69a67c1717323ff8477b371d"}, "json": null, "origin": "123.12.88.142", "url": "https://httpbin.org/post"
}
响应
除了使用text和content获取响应 的内容外,还有很多属性和方法可以获取诸如状态码、响应头、Cookie等。
import requestsr = requests.get('https://ssr1.scrape.center/')
# 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)
上面便分别打印了状态码、响应头、Cookie、URL、history。
高级用法
文件上传
刚刚我们抓取到了一张favicon.ico文件,就用它来模拟文件上传的过程。
import requestsfiles = {'file': open('favicon.ico', 'rb')
}r = requests.post('https://www.httpbin.org/post', files=files)
print(r.text)
结果如下:
Cookie设置
前面我们使用urllib库处理过Cookie,写法比较复杂,现在使用requests库来获取和设置Cookie。
获取Cookie
import requestsr = 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
设置Cookie
import requestsheaders = {'Cookie': '这里是Cookie值,在浏览器网络请求的标头中可以找到'
}r = requests.get('请求的URL', headers=headers)
print(r.text)
Session维持
直接利用requests库中的get和post方法的确可以做到模拟网页请求的操作,但这两个方法实际上相当于不同的session,或者说是两个浏览器打开了不同的页面。鉴于此,如果第一个请求利用requests库中的post方法登录了某个网站,第二个请求想要获取登录后的个人信息,于是又去使用get方法请求个人信息页面,这样的操作是不会成功的。
- 示例
import requestsrequests.get('https://www.httpbin.org/cookies/set/number/123456789')
r = requests.get('https://www.httpbin.org/cookies')
print(r.text)
此时输出为
{"cookies": {}
}
但如果我们使用Session对象,可以很方便的维护一个Session,而不用担心Cookie的问题。
import requestss = requests.Session()
s.get('https://www.httpbin.org/cookies/set/number/123456789')
r = s.get('https://www.httpbin.org/cookies')
print(r.text)
结果如下:
{"cookies": {"number": "123456789"}
}
SSL证书验证
有些网站没有设置好HTTPS证书,或网站的HTTPS证书可能并不被CA机构认可,这时网站可能出现SSL证书错误的提示。此时若使用requests库来请求这类网站,便会报错。
若我们一定要爬取这个网站,可以使用verify参数控制是否验证证书。
import requestsres = requests.get('https://ssr2.scrape.center/', verify=False)
print(res.status_code)
我们也可以指定一个本地证书,用作客户端证书。(这里的前提是你真的有这两个文件)
import requestsres = requests.get('https://ssr2.scrape.center/', cert=('../certs/client.pem', '../certs/client_key.pem'))
print(res.status_code)
身份认证
对于启用了基本身份认证功能的网站,我们可以使用requests库自带的身份认证功能。
import requests
from requests.auth import HTTPBasicAuthr = requests.get('https://ssr3.scrape.center/', auth=HTTPBasicAuth('admin', 'admin'))
print(r.status_code)
上面的代码也可以简写为:
import requestsr = requests.get('https://ssr3.scrape.center/', auth=('admin', 'admin'))
print(r.status_code)
代理设置
为了防止爬取网站时被封禁IP,可以使用代理。基本例子如下:
import requestsproxies = {'http': 'http://10.10.10.10:1080','https': 'http://10.10.10.10:1080',
}requests.get('https://www.httpbin.org/get', proxies=proxies)
除了基本的HTTP代理外,requests库还支持SOCKS协议的代理
- 安装socks库
pip3 install "requests[socks]"
- 使用案例
import requestsproxies = {'http': 'socks5://user:password@host:port','https': 'socks5://user:password@host:port'
}
requests.get('https://www.httpbin.org/get', proxies=proxies)