与urllib模块不同,requests模块发送请求可以用明确定义的函数实现,如:
requests.get()
requests.post()
import requests,json
data={
'name':'Tom',
'age':1
}
re=requests.get('http://httpbin.org/get',data)
print((re.text))
print(type(re.text))
print(json.loads(re.text))
print(re.json())
print(type(re.json()))
结果看到request返回的是json格式的数据,使用json.loads()函数或者直接使用响应的内置json()函数可以转成dict格式。
import requests
import re
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
r=requests.get('http://www.zhihu.com/explore',headers=headers)
pattern=re.compile('question_link.*?data-za-element-name.*?>(.*?)<',re.S)
print(re.findall(pattern,r.text))
简单的正则使用,用.*?表示所有内容,(.*?)表示要爬的所有内容。
re模块的compile()函数将正则表达式的字符串形式编译为Pattern实例。
import requests
r=requests.get('http://www.baidu.com/favicon.ico')
print(r.text)
print(r.content)
可以看到结果,图片的content是二进制数据;而text是乱码,因为图片本身是二进制数据,直接转成str,所以出现乱码。
import requests
data={
'name':'Tom',
'age':1
}
file={'file':open('favicon.ico','rb')}
r=requests.post('http://httpbin.org/post',files=file)
print(r.text)
r=requests.post('http://httpbin.org/post',data=data)
print(r.text)
可以看到form传值成功,files传文件成功,且二者分别是两个字段。
import requests
r=requests.get('http://github.com/favicon.ico')
with open('favicon.ico','wb') as f:
f.write(r.content)
以wb也就是二进制可写的格式,打开(也可以说是创建)favicon.ico文件,实例化一个可操作的句柄f,然后将图片的二进制内容写到文件里。
import requests
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
r=requests.get('http://www.zhihu.com/explore')
#print(r.text)
#print('------------------------------------------')
r=requests.get('http://www.zhihu.com/explore',headers=headers)
#print(r.text)
print(r.headers)
把浏览器和操作系统的版本信息加入User-Agent里,向服务器”表明“我是一个浏览器发出的请求。不加就不让访问。
import requests
r=requests.get('http://www.zhihu.com')
exit() if r.status_code==requests.codes.ok else print('bad') if r.status_code==requests.codes.bad else print('failed!')
一般我们可以通过请求返回的status_code比如200,404来判断请求的状态;也可以通过request模块自带的状态码比较来确定请求状态,比如requests.code.bad=400。
import requests
r=requests.post('https://www.zhihu.com')
print(r.cookies)
for cookie in r.cookies.items():
print(cookie)
for key,value in r.cookies.items():
print(key+'='+value)
import requests,json
header={
'Cookie':'_zap=6458ace3-1edf-4299-b8d4-ab9091e5c58d; aliyungf_tc=AQAAAEKJcASu8AgAh2swtvTdAh1ka0RI; _xsrf=a3adb075-779c-4024-ae60-6febe2f67f33; d_c0="AGCtroJkSg2PTtfrzlwPpyc1H80VmpRvUWs=|1521110703"; __DAYU_PP=mMjnjZUQfZmIm7Nb7j2Bffffffff8776db8f9c58; q_c1=b03af7dbbafd44f0a5632d0a41ad8f4d|1526133366000|1510569878000; __utmc=51854390; l_n_c=1; n_c=1; __utma=51854390.997924031.1514114614.1526815674.1526818086.4; __utmb=51854390.0.10.1526818086; __utmz=51854390.1526818086.4.3.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/signin; tgw_l7_route=7139e401481ef2f46ce98b22af4f4bed; l_cap_id="YzQxYTc2MWQ4ZDBiNDQ1M2JmZjYyZDdmM2UxYTU2YzY=|1526818969|74c45f403d7f89c6814d20f931d752895572faa8"; r_cap_id="YmY2ZjRjMjUyYzk3NDRiOWFjYzU0M2U1ZWZiYjU1MGY=|1526818969|fd2843f198e9a0946a65971231d192cad7155a64"; cap_id="OTA3MTdlMTljODUxNGQzYWE5ZWY2YzA0MDU3ZmQxMzY=|1526818969|edea420073690dc46a27f009fa0730e2c488b01a"; __utmv=51854390.000--|2=registration_date=20140211=1^3=entry_date=20171113=1; capsion_ticket="2|1:0|10:1526819021|14:capsion_ticket|44:NTllNmQyM2I5OGM5NGRlMWJkNGQxYzJlYjAyODg5YWM=|e06d27186b6649cc794a284b8f8969a99873f2e721cde1f2f8da1c62b0e9cff7"; z_c0=Mi4xYkU0MkFBQUFBQUFBWUsydWdtUktEUmNBQUFCaEFsVk4zTGJ1V3dEV1o4N0FWT1JnYkk1NmxybG1Cd1RZRl9HQUdB|1526819036|bec8c376c3610229078d559195bb810ea009eb87',
'Host':'www.zhihu.com',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
r=requests.get('https://www.zhihu.com',headers=header)
print(r.text)
import requests
cookie='_zap=6458ace3-1edf-4299-b8d4-ab9091e5c58d; aliyungf_tc=AQAAAEKJcASu8AgAh2swtvTdAh1ka0RI; _xsrf=a3adb075-779c-4024-ae60-6febe2f67f33; d_c0="AGCtroJkSg2PTtfrzlwPpyc1H80VmpRvUWs=|1521110703"; __DAYU_PP=mMjnjZUQfZmIm7Nb7j2Bffffffff8776db8f9c58; q_c1=b03af7dbbafd44f0a5632d0a41ad8f4d|1526133366000|1510569878000; __utmc=51854390; l_n_c=1; n_c=1; __utma=51854390.997924031.1514114614.1526815674.1526818086.4; __utmb=51854390.0.10.1526818086; __utmz=51854390.1526818086.4.3.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/signin; tgw_l7_route=7139e401481ef2f46ce98b22af4f4bed; l_cap_id="YzQxYTc2MWQ4ZDBiNDQ1M2JmZjYyZDdmM2UxYTU2YzY=|1526818969|74c45f403d7f89c6814d20f931d752895572faa8"; r_cap_id="YmY2ZjRjMjUyYzk3NDRiOWFjYzU0M2U1ZWZiYjU1MGY=|1526818969|fd2843f198e9a0946a65971231d192cad7155a64"; cap_id="OTA3MTdlMTljODUxNGQzYWE5ZWY2YzA0MDU3ZmQxMzY=|1526818969|edea420073690dc46a27f009fa0730e2c488b01a"; __utmv=51854390.000--|2=registration_date=20140211=1^3=entry_date=20171113=1; capsion_ticket="2|1:0|10:1526819021|14:capsion_ticket|44:NTllNmQyM2I5OGM5NGRlMWJkNGQxYzJlYjAyODg5YWM=|e06d27186b6649cc794a284b8f8969a99873f2e721cde1f2f8da1c62b0e9cff7"; z_c0=Mi4xYkU0MkFBQUFBQUFBWUsydWdtUktEUmNBQUFCaEFsVk4zTGJ1V3dEV1o4N0FWT1JnYkk1NmxybG1Cd1RZRl9HQUdB|1526819036|bec8c376c3610229078d559195bb810ea009eb87'
head={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
'Host':'www.baidu.com'
}
jar=requests.cookies.RequestsCookieJar()
for items in cookie.split(';'):
key,value=items.split('=',1)
jar.set(key,value)
re=requests.get('http://www.baidu.com',cookies=jar,headers=head)
print(re.text)
与上一例结果一样。
首先使用requests.cookies.RequestsCookieJar()函数实例化一个cookie对象jar;
其中用到split(‘=’,1)函数,第一个参数为分割符号,第二个参数为分割次数。
将分割得到的key和value值通过jar的set()函数赋值;最后jar直接作为请求的一个参数。
不同的会话有不同的cookie。而使用session()这样可以用另一个请求访问之前请求设定的cookie值。
import requests
s=requests.session()
s.get('http://httpbin.org/cookies/set/number/123')
r=s.get('http://httpbin.org/cookies')
print(r.text)
由于12306没有官方CA证书,所以请求https站点会报错。
import requests
r=requests.get('https://www.12306.cn')
requests.exceptions.SSLError:HTTPSConnectionPool(host='www.12306.cn', port=443)
这里把verify参数设为False,就不会检查ssl证书。
import requests
r=requests.get('https://www.12306.cn',verify=False)
print(r.status_code)
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
200
但仍会警告:强烈建议我们给它个证书。
可以设置忽略警告
import requests
from requests.packages import urllib3
urllib3.disable_warnings()
response=requests.get('https://www.12306.cn',verify=False)
print(response.status_code)
或者用logging模块捕捉一下警告。
import requests
import logging
logging.captureWarnings(True)
response=requests.get('https://www.12306.cn',verify=False)
print(response.status_code)
最可靠的,我们可以指定本地一个证书,并加入到请求里。
import requests
response=requests.get('https://www.12306.cn',cert=('/path/证书','/path/密钥'))
和urllib使用代理同理。
import requests
proxies={
'http':'http:xxxxxxxxxxxxxx'
'https':'https://xxxxxxxxxxx'
}
re=requests.get(url,proxies=proxies)
request可以设置参数timeout来设置等待时间。
time=None一直等待
请求时间可以分为两部分:连接和读取。
所以timeout也可以分别设置两段时间,如
timeout=(2,3,10)
对于网页访问时弹出的身份认证窗口,通过参数auth来输入用户名和密码
auth=('username','password')
利用requests模块下的Request和session函数。
首先用Request函数实例化请求,即把 请求方法,url,还有其他参数作为Request函数的参数构造一个请求。再用会话session的prepare_request函数将其转化为prepare request对象。最后通过会话session的send函数发送请求。
from requests import Request,session
url='http://httpbin.org/post'
headers={
'Uset-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
data={'name':'Tom','age':'10'}
s=session()
re=Request('Post',url,headers=headers,data=data)
pre=s.prepare_request(re)
r=s.send(pre)
print(r.text)
可以看到和直接用post方法发送请求一样效果。