网络爬虫之requests模块

May 28, 2018 Python学习 访问: 46 次

请求方式

requests库提供了http所有的基本请求方式

r = requests.get("http://httpbin.org/post")
r = requests.post("http://httpbin.org/post")
r = requests.put("http://httpbin.org/put")
r = requests.delete("http://httpbin.org/delete")
r = requests.head("http://httpbin.org/get")
r = requests.options("http://httpbin.org/get")

GET请求

最基本的GET请求可以直接用get方法
get_url = resquests.get('http://127.0.0.1/index.php')
加参数
import requests
payload = {'key_1':'value_1','key_2':'value_2'}
r = requests.get("http://www.baidu.com",params = payload)
print r.url
运行结果
"http://www.baidu.com/?username=admin&password=admin"
如果想获取来自服务器的原始套接字响应,可以取得 r.raw 。 不过需要在初始请求中设置 stream=True 。
r = requests.get("http://www.baidu.com" , stream = True )
print r.raw
结果
<urllib3.response.HTTPResponse object at 0x0000000003A9C3C8>
如果想添加 headers,可以传 headers 参数
import requests
payload = {'key_1': 'value_1', 'key_2': 'value_2'}
headers = {'content-type': 'application/json'}
r = requests.get("http://www.baidu.com", params=payload, headers=headers)
print r.url
通过headers参数可以增加请求头中的headers信息

POST请求

对于 POST 请求来说,我们一般需要为它增加一些参数。那么最基本的传参方法可以利用 data 这个参数。
import requests
payload = {'key_1': 'value_1', 'key_2': 'value_2'}
r = requests.post("http://www.baidu.com", data=payload)
print r.text
结果
{
    "args":{},
    "data":"",
    "files":{},
    "form":{
        "key_1":"value_1",
        "key_2":"value_2"
        },
    "headers":{
    "Accept":"*/*",
    "Accept-Encoding":"gzip,
    deflate","Connection":"close","Content-Length":"27",
    "Content-Type":"application/x-www-form-urlencoded",
    "Host":"httpbin.org",
    "User-Agent":"python-requests/2.18.4"
    },
    "json":null,
    "origin":"117.158.83.66",
    "url":"http://httpbin.org/post"
}

如果想要上传文件,那么直接用 file 参数即可

import requests
url = "http://httpbin.org/post"
file = {'file': open('filename','rb')
r = requests.post(url,files = fule)
print r.text
结果
{
  "args": {},
  "data": "",
  "files": {
    "file": "Hello World!"
  },
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "156",
    "Content-Type": "multipart/form-data; boundary=7d8eb5ff99a04c11bb3e862ce78d7000",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.9.1"
  },
  "json": null,
  "url": "http://httpbin.org/post"
}
requests 是支持流式上传的,这允许你发送大的数据流或文件而无需先把它们读入内存。要使用流式上传,仅需为你的请求体提供一个类文件对象即可
with open('massive-body') as f:
    requests.post('http://some.url/streamed', data=f)

Cookie

获取cookie值(==不知为什么不能获取到具体的COOKIE值==)
import requests
url = "http://www.baidu.com"
r = resquests.get(url)
print r.cookies
结果
<RequestsCookieJar[]>
想一个url中加入cookie值
import requests
url = 'http://httpbin.org/cookies'
cookies = dict(cookie_are='working')
r = requests.get(url,cookies=cookies)
print r.text
结果
{"cookies":{"cookie_are":"working"}}

设置最大请求时间

利用timeout变量来设置最大请求时间
requests.get('http://github.com', timeout=0.001)
==timeout 仅对连接过程有效,与响应体的下载无关。==

会话对象

在以上的请求中,每次请求其实都相当于发起了一个新的请求。也就是相当于我们每个请求都用了不同的浏览器单独打开的效果。也就是它并不是指的一个会话,即使请求的是同一个网址。
解决方案
import requests
s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
print(r.text)
结果
请求了两次,一次是设置 cookies,一次是获得 cookies
{
  "cookies": {
    "sessioncookie": "123456789"
  }
}

全局的配置

import requests
s = requests.Session()
s.headers.update({'x-test': 'true'})
r = s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
print r.text
通过 s.headers.update 方法设置了 headers 的变量。然后我们又在请求中设置了一个 headers,最后会发现两个值都传到了header头里面
结果
{
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.9.1",
    "X-Test": "true"
  }
}
如果不想要全局配置中的一个变量,设置为 None 即可
r = s.get('http://httpbin.org/headers', headers={'x-test': None})
结果
{
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.9.1"
  }
}

代理

import requests
proxies = {
  "https": "http://41.118.132.69:4433"
}
r = requests.post("http://httpbin.org/post", proxies=proxies)
print r.text
也可以通过环境变量 HTTP_PROXY 和 HTTPS_PROXY 来配置代理
export HTTP_PROXY="http://10.10.1.10:3128"
export HTTPS_PROXY="http://10.10.1.10:1080"

添加新评论