requests功能
程序员文章站
2022-03-02 22:25:31
...
requests功能
使用GET和POST发送请求
(1)使用requests发送get请求将百度搜索的页面源码爬回来,返回的是百度搜索页面的HTML源码。
>>> import requests
>>> r = requests.get("https://www.baidu.com") #像百度发送请求并返回一个对象
>>> r = r.text #获取文本对象
>>> print(r) #打印结果
(2)用post的方法向httpbin.org这个网站发送请求并获得数据,返回的是json数据。什么是 json数据
>>> r = requests.post("http://httpbin.org/post",data={'key':'value'})
>>> r = r.text
>>> print(r)
通过URL传递参数
URL不仅是一个网址,在访问URL的时候经常带上一些查询的字符串,这就是请求参数。request允许通过字典或者字符串来传参。
>>> import requests
>>> payload = {'key1' : 'value1' , 'key2' : 'value2'}
>>> r = requests.get('http://httpbin.org/get',params = payload)
>>> print(r.url)
# http://httpbin.org/get?key1=value1&key2=value2
>>> payload = {'key1' : 'value1' , 'key2' : ['value2','value3']}
>>> r = requests.get('http://httpbin.org/get',params = payload)
>>> print(r.url)
# http://httpbin.org/get?key1=value1&key2=value2&key2=value3
设置超时
在请求的时候设置超时等待时间,可以避免等待太久。在请求的时候给参数timeout一个数值,单位是秒。如果请求超过这个值,就会断开并报错。
r = requests.get('http://baidu.com',timeout=0.001)
# requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='baidu.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7fda950fcfd0>, 'Connection to baidu.com timed out. (connect timeout=0.001)'))
查看返回内容
打印response内容
>>> import requests
>>> r = requests.get("https://www.baidu.com") #像百度发送请求并返回一个对象
>>> r = r.text #获取文本对象
>>> print(r) #打印结果
当发起一个请求的时候,requests会根据HTTP的headers进行编码
>>> r.encoding
# 'ISO-8859-1'
>>> r.encoding = 'utf-8'
>>> r.encoding
# 'utf-8'
设置请求头
爬虫必须让自己看起来不像爬虫,因此爬虫需要伪装,设置请求头,可以让爬虫爬取的过程看起来是一个用户在使用浏览器浏览。
HTTP消息头,以明文的字符串格式传送,是以冒号分隔的键/值对。
HTTP消息头是客户端请求或服务器相应的时候传递的头部信息,内容包含了浏览器信息、请求数据类型等。发送请求的时候消息头称为请求头,服务器返回内容时的消息成为响应头。
>>> headers = {'user-agent':'Opera/9.80(Macintosh;Intel Mac OS X 10.6.8;U;fr)presto/2.0.168 version/11.52'}
>>> r = requests.get('http://baidu.com',headers = headers)
>>> r = r.text
更多复杂的POST请求
>>> payload = {'key1' : 'value1' , 'key2' : ['value2','value3']}
>>> r = requests.post('http://httpbin.org/post',params = payload)
>>> print(r.text)
# 返回的结果
”“”
{
"args": {
"key1": "value1",
"key2": [
"value2",
"value3"
]
},
"data": "",
"files": {},
"form": {},
# 请求头
"headers": {
"Accept": "*/*",
# 解码方式
"Accept-Encoding": "gzip, deflate",
#内容长度
"Content-Length": "0",
# 主机域名
"Host": "httpbin.org",
#请求UA
"User-Agent": "python-requests/2.25.1",
"X-Amzn-Trace-Id": "Root=1-600c086f-60e8e1057f12c59549a6c263"
},
"json": null,
# 请求者 IP
"origin": "120.228.161.240",
#请求URL
"url": "http://httpbin.org/post?key1=value1&key2=value2&key2=value3"
}
“”“
返回对象状态码
>>> r = requests.get('http://httpbin.org/get')
>>> r.status_code
200
设置代理IP
如果爬虫是进行长时间的大量爬取,一定要给爬虫配上代理IP。
>>> import requests
>>> proxies = {'http':'http://10.10.1.10:3128','https':'http://10.10.1.10:1080'}
>>> requests.get('http://example.org',proxies=proxies)
如果代理需要用户密码认证
proxies = {'http':'http://user:[email protected]:3128/'}