1、官方文档:Requests: HTTP for Humans 。(秒杀urllib、urllib2、httplib。。。)
1.1、请求主要参数说明:requests.request(method, url, **kwargs)
2、官方下载地址:https://pypi.python.org/pypi/requests
3、安装方法:
pip install requests -i https://mirrors.aliyun.com/pypi/simple/
4、一个有用的特性:持久保持cookie。(参考这里)
5、添加cookie:(可以参阅这篇文章)
requests.utils.add_dict_to_cookiejar(cj, cookie_dict)
5.1、如果sn.headers['Cookie']有值,那么sn.cookies 不再起作用。
6、用python爬虫抓站的一些技巧总结,注意(3.5 终极绝招)中提到的工具:selenium,pamie,watir。
7、Python的扩展包requests的高级用法,应该是这两个页面的组合翻译:一,二。
8、关于默认超时值:socket.getdefaulttimeout() requests 库 使用过程中timeout值最大可设值?
9、Requests在get时url中的百分号(%)被强制编码为 25% 可用如下方法迂回解决。(参考评论)
import requests
sn = requests.Session()
url = 'http://xxx.net/xxx.aspx?Param=ASP.brief_result_aspx%23/%u5E74
req = requests.Request('GET', url)
prepped = sn.prepare_request(req)
prepped.url = prepped.url.replace('%25', '%')
r = sn.send(prepped)
或者拆分后重新拼接:
import requests
from urllib import parse
url = 'http://xxx.net/xxx.aspx?' + parse.urlencode(dict(parse.parse_qsl(parse.urlparse(url).query)))
r = sn.get(url)
10、post表单重复键值的处理:
dic = {
'key1': ['aaa', 'bbb', 'ccc'],
'key2': 'xxx',
}
r = requests.post(url, data=dic)
这样会被编码成:key1=aaa&key1=bbb&key1=ccc&key2=xxx
11、关于 Request Payload。(POST a Multipart-Encoded File)
代码:
import requests
import json
r = requests.post('http://www.baidu.com', files={'key':'val'})
print('***test 1: %s' % r.request.body)
print('------------------------')
print(r.request.body.decode('utf8'))
print('\n')
line = json.dumps({'k1':'v1', 'k2':'v2'})
r = requests.post('http://www.baidu.com', files={'json':(None, line)})
print('***test 2: %s' % r.request.body)
print('------------------------')
print(r.request.body.decode('utf8'))
输出:
***test 1: b'--5b57f36c03ca462f93dfbd8dfc97e2d1\r\nContent-Disposition: form-data; name="key"; filename="key"\r\n\r\nval\r\n--5b57f36c03ca462f93dfbd8dfc97e2d1--\r\n'
------------------------
--5b57f36c03ca462f93dfbd8dfc97e2d1
Content-Disposition: form-data; name="key"; filename="key"
val
--5b57f36c03ca462f93dfbd8dfc97e2d1--
***test 2: b'--cf66a355e1f6441fa5a3079e1fafc43a\r\nContent-Disposition: form-data; name="json"\r\n\r\n{"k1": "v1", "k2": "v2"}\r\n--cf66a355e1f6441fa5a3079e1fafc43a--\r\n'
------------------------
--cf66a355e1f6441fa5a3079e1fafc43a
Content-Disposition: form-data; name="json"
{"k1": "v1", "k2": "v2"}
--cf66a355e1f6441fa5a3079e1fafc43a--
12、关闭 https 证书警告。
import requests
from urllib3.exceptions import InsecureRequestWarning
# 关闭 https 证书警告
requests.urllib3.disable_warnings(InsecureRequestWarning)
13、用Requests实现聊天的小黄鸡和小黑鸡。(参考这篇文章)
(1)、源码
#coding=utf-8
import requests
class SimSimi:
def __init__(self):
self.session = requests.Session()
def initCookie(self):
headers = {
'x-requested-with': 'XMLHttpRequest',
'Accept-Language': 'zh-cn',
'Referer': 'http://www.simsimi.com/talk.htm',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Content-Type': 'application/json; charset=utf-8',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)',
'Host': 'www.simsimi.com',
'Connection': 'Keep-Alive',
#Cookie是否设置似乎没有关系
#'Cookie': '',
}
self.session.headers.update(headers)
self.session.get('http://www.simsimi.com/talk.htm')
self.session.get('http://www.simsimi.com/talk.htm?lc=ch')
self.session.headers.update({'Referer': 'http://www.simsimi.com/talk.htm?lc=ch'})
def getAnswer(self, message="hello"):
url = 'http://www.simsimi.com/func/req?msg=%s&lc=ch'
r = self.session.get(url=url%message)
if len(r.json()) < 1:
return ("hehe...")
else:
return r.json()['response']
simi = SimSimi()
simi.initCookie()
msg = u'花果山'
print(u'topic: ' + msg)
for i in range(1, 5):
msg = simi.getAnswer(msg)
print i,
if i % 2 == 0:
print u"小黄鸡:",
else:
print u"小黑鸡:",
try:
print(msg)
except:
print('哈哈')
(2)、效果
topic: 花果山
1 小黑鸡: 我也没去过 听说那是个传说 也许在他们心中吧
2 小黄鸡: 去过啊。很美的。
3 小黑鸡: 别难过哈~开心点~努力!让自己更优秀!让爱你的人自豪!
4 小黄鸡: 没关系。开心点。
【相关阅读】
*** walker * Updated 2017-01-13 ***
转载于:https://blog.51cto.com/walkerqt/1228225