requests

  1. get()方法
import requests

r = requests.get('https://www.baidu.com/')
# <class 'requests.models.Response'>
print(type(r))
# 状态码
print(r.status_code)
# 返回的是str
print(type(r.text))
# 响应的文本内容
print(r.text)
# cookies的类型是RequestsCookieJar
print(r.cookies)

其他的请求,也是一句话

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')

在请求中添加参数:

import requests

data = {
    'name': 'germey',
    'age': 22
}
r = requests.get("http://httpbin.org/get", params=data)
# 网页的返回类型是JOSN格式的
print(r.text)

请求的链接自动被构造成了:http://httpbin.org/get?age=22&name=germey

解析返回结果得到一个Json格式

import requests

r = requests.get("http://httpbin.org/get")
print(type(r.text))
# 将返回结果是 Json 格式的字符串转化为字典
print(r.json())
print(type(r.json()))

抓取网页

import requests
import re

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
# 加入headers模拟浏览器访问
r = requests.get("https://www.zhihu.com/explore", headers=headers)
pattern = re.compile('explore-feed.*?question_link.*?>(.*?)</a>', re.S)
titles = re.findall(pattern, r.text)
print(titles)

如果抓取的是图片信息,需要用二进制解析:

import requests

r = requests.get("https://github.com/favicon.ico")
# 直接这样输出会将图片转为字符串,会乱码
print(r.text)
# 输出二进制
print(r.content)

POST请求

模拟表单提交一样,将一些数据提交到某个链接。

import requests

data = {'name': 'germey', 'age': '22'}
r = requests.post("http://httpbin.org/post", data=data)
print(r.text)

Response

import requests

# status_code属性得到状态码
r = requests.get('http://www.jianshu.com')
print(type(r.status_code), r.status_code)
#  headers属性得到Response Headers
print(type(r.headers), r.headers)
# cookies属性得到cookies
print(type(r.cookies), r.cookies)
# url属性得到URL
print(type(r.url), r.url)
# history 属性得到请求历史
print(type(r.history), r.history)

高级用法

文件上传

import requests

files = {'file': open('favicon.ico', 'rb')}
r = requests.post('http://httpbin.org/post', files=files)
print(r.text)

运行的结果:

{
  "args": {}, 
  "data": "", 
  "files": {
    "file": "data:application/octet-stream;base64,AAAAAA...="
  }, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "6665", 
    "Content-Type": "multipart/form-data; boundary=809f80b1a2974132b133ade1a8e8e058", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.10.0"
  }, 
  "json": null, 
  "origin": "60.207.237.16", 
  "url": "http://httpbin.org/post"
}

文件上传部分会单独有一个 files 字段来标识。

Cookies

import requests

r = requests.get('https://www.baidu.com')
print(r.cookies)
for key, value in r.cookies.items():
    print(key + '=' + value)

我们也可以直接用 Cookies 来维持登录状态,首先登录知乎,将 Headers 中的 Cookies 复制下来

import requests

 headers = {
        'cookies': 'tgw_l7_route=29b95235203ffc15742abb84032d7e75; _zap=1970b363-1921-4cc4-aed7-f3c2c4f5a47a; _xsrf=vxZRLb8Gh0BIQremmczNFeLx4hVz1EFK; d_c0="AIDmBvPeGw6PTpItKeK0AL02HnealibyVJI=|1535168552"; capsion_ticket="2|1:0|10:1535168561|14:capsion_ticket|44:ZGFmZWY4NDVlMTdlNGM1NjhlY2U0ZGExZTQ3ZDEwMTQ=|fc82cf9a1b3f9acfecf335b554a3fd580b8bf2519c04e5542235aca37b63f3a7"; z_c0="2|1:0|10:1535168583|4:z_c0|92:Mi4xcVI5cEJRQUFBQUFBa0tiNDh0NGJEaWNBQUFDRUFsVk5SMTJvV3dBSU9mcGtyUy1qSEZBM042a1JuV1pLUU9HTXdR|356ac6d95010fd75b9c1117217e393035e2a22756cd019aec55cbd46b136ef42"; q_c1=ec67944e57474b51843c2a907b124fc1|1535168583000|1535168583000',
        'Host': 'www.zhihu.com',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
    }
    r = requests.get('https://www.zhihu.com', headers=headers)
    print(r.text)

通过 cookies 参数来设置,不过这样就需要构造 RequestsCookieJar 对象,而且需要分割一下 Cookies ,相对繁琐,不过效果是相同的,实例如下:

import requests

cookies = 'tgw_l7_route=29b95235203ffc15742abb84032d7e75; _zap=1970b363-1921-4cc4-aed7-f3c2c4f5a47a; _xsrf=vxZRLb8Gh0BIQremmczNFeLx4hVz1EFK; d_c0="AIDmBvPeGw6PTpItKeK0AL02HnealibyVJI=|1535168552"; capsion_ticket="2|1:0|10:1535168561|14:capsion_ticket|44:ZGFmZWY4NDVlMTdlNGM1NjhlY2U0ZGExZTQ3ZDEwMTQ=|fc82cf9a1b3f9acfecf335b554a3fd580b8bf2519c04e5542235aca37b63f3a7"; z_c0="2|1:0|10:1535168583|4:z_c0|92:Mi4xcVI5cEJRQUFBQUFBa0tiNDh0NGJEaWNBQUFDRUFsVk5SMTJvV3dBSU9mcGtyUy1qSEZBM042a1JuV1pLUU9HTXdR|356ac6d95010fd75b9c1117217e393035e2a22756cd019aec55cbd46b136ef42"; q_c1=ec67944e57474b51843c2a907b124fc1|1535168583000|1535168583000'
    jar = requests.cookies.RequestsCookieJar()
    headers = {
        'Host': 'www.zhihu.com',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0;WOW 64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    }
    # ,然后将复制下来的 Cookies 利用 split() 方法分割
    for cookie in cookies.split(';'):
        key, value = cookie.split('=', 1)
        # 设置好每一个 Cookie 的 key 和 value
        jar.set(key, value)

    r = requests.get('http://www.zhihu.com', cookies=jar, headers = headers)
    print(r.text)

会话维持

利用 Session 我们可以做到模拟同一个会话,而且不用担心 Cookies 的问题

import requests

s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)

代理设置

import requests

proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}

requests.get('https://www.taobao.com', proxies=proxies)

代理需要使用 HTTP Basic Auth

import requests

proxies = {
    'https': 'http://user:password@10.10.1.10:3128/',
}
requests.get('https://www.taobao.com', proxies=proxies)

使用 SOCKS 协议代理,使用类似 http://user:password@host:port 这样的语法来设置代理。

import requests

proxies = {
    'http': 'socks5://user:password@host:port',
    'https': 'socks5://user:password@host:port'
}
requests.get('https://www.taobao.com', proxies=proxies)

超时设置

请求分为两个阶段,即 connect(连接)和 read(读取)。

# 设置 timeout 值将会用作 connect 和 read 二者的 timeout 总和
r = requests.get('https://www.taobao.com', timeout=1)
# 分别指定
r = requests.get('https://www.taobao.com', timeout=(5, 11))

身份认证

遇到必须要认证的网站验证,可以使用 Requests 自带的身份认证功能。

import requests
from requests.auth import HTTPBasicAuth
# 传HTTPBasicAuth类
r = requests.get('http://localhost:5000', auth=HTTPBasicAuth('username', 'password'))
# 直接传一个元组,它会默认使用 HTTPBasicAuth 这个类来认证
r = requests.get('http://localhost:5000', auth=('username', 'password'))
print(r.status_code)

使用 OAuth1 认证的方法:

import requests
from requests_oauthlib import OAuth1

url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
auth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET',
              'USER_OAUTH_TOKEN', 'USER_OAUTH_TOKEN_SECRET')
requests.get(url, auth=auth)

Prepared Request

Request 的各个参数都可以通过一个 Request 对象来表示

from requests import Request, Session

url = 'http://httpbin.org/post'
data = {
    'name': 'germey'
}
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
}
s = Session()
req = Request('POST', url, data=data, headers=headers)
prepped = s.prepare_request(req)
r = s.send(prepped)
print(r.text)

有了 Request 这个对象,我们就可以将一个个请求当做一个独立的对象来看待,这样在进行队列调度的时候会非常方便,后面我们会有一节使用它来构造一个 Request 队列。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容