一,request的简单应用
#1请求地址
URL='https://example.com/login'
#2参数表单
form_data = {
'username': 'admin',
'password': 'secret'
}
#3返回的响应对象response
response = requests.post(
URL,data=form_data,timeout=5
)
#4处理返回结果,这里直接打印返回网页的正文。通常需要json转化,和encode编码下
print(reponse.content)
1,请求头需要设置,有些网站会限制访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
'Referer': 'https://www.99csw.com/',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
try:
# 发送HTTP请求
response = requests.get(url, headers=headers, timeout=15)
2,response的属性
发送request请求后,返回的reponse对象里有我们要的信息,需要处理。常用的3个标粗了。
属性/方法 | 类型/返回类型 | 说明 |
---|---|---|
status_code | int | HTTP 状态码(如 200、404、500) |
headers | CaseInsensitiveDict | 响应头字典(不区分大小写) |
text | str | 解码后的文本内容(自动根据 encoding 解码) |
content | bytes | 原始字节内容(未解码的二进制数据) |
json() | dict /list | 解析 JSON 响应内容(非 JSON 内容会抛异常) |
url | str | 最终请求的 URL(含重定向后的地址) |
encoding | str | 响应内容的编码格式(可手动修改) |
apparent_encoding | str | 通过内容分析出的编码格式(自动检测) |
raw | HTTPResponse | 原始响应流对象(需配合 stream=True 使用) |
cookies | RequestsCookieJar | 服务器返回的 Cookies |
elapsed | datetime.timedelta | 请求耗时(从发送到响应完成的时间) |
history | list[Response] | 重定向历史记录列表 |
reason | str | 状态码的文本描述(如 200 → "OK",404 → "Not Found") |
request | PreparedRequest | 关联的请求对象(含请求头、方法、URL 等信息) |
rep = reponse.content.decode('utf8'),content获取的正文是二进制,注意编码。
正文处理通常需要 json格式化 和 re正则模块 的匹配。
#对返回content正文中,span标签的获取,标题内容获取
pattern1 = re.compile(r'<span class="title">([^&]*?)</span>')
titles = pattern1.findall(resp.text)
3,session会话保持,处理cookie,保持会话。
Session 对象存储特定用户会话所需的属性及配置信息。可以带上cookie含帐号密码。
成功登陆之后,直接获取返回响应的cookie
def login():
login_url = 'http://www.xxx.com/login'
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01"
}
body = {
"usercode": "liuzz05@****.com",
"password": "123456"
}
try:
res = requests.post(url=login_url, headers=headers, data=body)
cookies = res.cookies
cookie = requests.utils.dict_from_cookiejar(cookies)
return cookie
except Exception as err:
print('获取cookie失败:\n{0}'.format(err))
如果没有,先登录,从浏览器工具栏取cookie,找信息。
F12检查请求。cookie里有大串字母,password,token等字样说明这个可能是带密码账号的cookie,要具体情况定。
直接使用cookie,或者把cookie放在header参数中,依据具体网站请求头格式而定
把cookie转化为字典格式,手动扣cookie的键值对。本地文件写入分析,拼接
def get_data():
cookie = login()
res = requests.get(url=get_data_url, cookies=cookie)
print(res.text)
def get_data():
cookie = login()
headers = {
"cookie": cookie
}
res = requests.get(url=get_data_url, headers=headers)
print(res.text)
一个完整的登录案例。
def auto_login():
s = requests.Session()
r = s.get(login_url)
bs = BeautifulSoup(r.text,'html.parser')
image = bs.find("img", {"id": "vcJpeg"})['src']
lt_data = bs.find("input", {"name": "lt"})['value']
csr_data = bs.find("input", {"name": "csrftoken"})['value']
sec_data = bs.find("input", {"name": "sec"})['value']
#print(lt_data,",",csr_data,",",sec_data)
rootdir="http://172.16.5.12:10086"
ir = s.get(rootdir+image)
if ir.status_code == 200:
with open('valid.jpg', 'wb') as f:
f.write(ir.content);
f.close();
validateCode = get_code(Image.open('valid.jpg')) # 通过本地图片解析验证码
print(validateCode)
postdata={
'csrftoken': csr_data,
'username': uosp_username,
'password': base64.b64encode(uosp_passwd.encode('utf-8')),
'institute': '00010000',
'validateCode': validateCode,
'lt': lt_data,
'sec': sec_data,
'dn': '',
'ip': '144.4.44.44',
'_eventId':'submit',
}
print(postdata)
form_data={
"action":"GetINCInfoByID",
"id":"INC000287932",
}
s.post(login_url,data = postdata)
s.post(incident_url,data = form_data)
s.post(servicelogin_url)
cookies_dict = requests.utils.dict_from_cookiejar(s.cookies) # 登录后页面的cookie转化为dict
#print("cookies is that ",cookies_dict)
if ('.ASPXUSERDEMO' in cookies_dict): # 如果登录成功,cookie中会有.ASPXUSERDEMO字段值
cookies = open('login_cookies', 'w')
cookies.write(str(cookies_dict)) # 将cookie信息写入本地文件,其他模块直接访问文件可以绕过登录
cookies.close()
return s
else:
return None