获取登录窗口背后的信息
大多数网站的服务器进行数据交互时都是用HTTP 协议的 GET 方法去请求信息,而页面表单基本上可以看成是一种用户提交 POST 请求的方式。就像网站的 URL 链接可以帮助用户发送 GET 请求一样,HTML 表单可以帮助用户发出 POST 请求。
Requests 库是一个擅长处理那些复杂的 HTTP 请求、cookie、header(响应头和请求头)等内容的 Python 第三方库。
1 表单提交只需要关注两件事
:
• 你想提交数据的字段名称(本案例是firstname,lastname)
• 表单的 action 属性,也就是表单提交后网站会跳转到的页面(本案例是http://url1)
- 常见的表单如下:
import requests
params = {'firstname': 'Ryan', 'lastname': 'Mitchell'}
r = requests.post("url1", data=params)
print(r.text)
- 如果遇到上传图片文件,如下:
则构造请求如下:
提交文件的方式如下:
files = {'uploadFile': open('../files/Python-logo.png', 'rb')}
r = requests.post("url2",files=files)
- 碰到的是传递参数的GET请求,我们只需要观察URL形式就可以确认相应的表单:
http://domainname.com?thing1=foo&thing2=bar
这个请求就是下面这种表单:
对应的 Python 参数就是:
{'thing1':'foo', 'thing2':'bar'}
2 处理登录和cookie
大多数新式的网站都用 cookie 跟踪用户是否已登录的状态信息。有的网站经常暗自调整cookie,或者如果你从一开始就完全不想要用 cookie,那么 Requests 库的session函数可以完美地解决这些问题。
import requests
session = requests.Session()
params = {'username': 'username', 'password': 'password'}
s = session.post("http://pythonscraping.com/pages/cookies/welcome.php", params)
print("Cookie is set to:")
print(s.cookies.get_dict())
print("-----------")
print("Going to profile page...")
s = session.get("http://pythonscraping.com/pages/cookies/profile.php")
print(s.text)
会话(session)对象(调用 requests.Session() 获取)会持续跟踪会话信息,像 cookie、header,甚至包括运行 HTTP 协议的信息。
3 HTTP基本接入认证
在发明 cookie 之前,处理网站登录最常用的方法就是用 HTTP 基本接入认证(HTTP basicaccess authentication)。有时还能见到它们,尤其是在一些安全性较高的网站或公司网站。Requests 库有一个 auth 模块专门用来处理 HTTP 认证:
import requests
from requests.auth import AuthBase
from requests.auth import HTTPBasicAuth
auth = HTTPBasicAuth('ryan', 'password')
r = requests.post(url="http://pythonscraping.com/pages/auth/login.php", auth=auth)
print(r.text)