一、处理登录表单
有一些网站需要登录或者输入验证码才可以进行访问,还有一种是评论等功能。因此,处理表单和登录成为进行网络爬虫不可或缺的一部分。这里涉及到提交表单向网页上传数据,我们通常发送请求有两种方式GET和POST。我们一般使用POST请求提交数据,因为查询字符串(名称/值)在POST请求的HTTP消息主体中,敏感信息不会出现在URL中,参数也不会被保存在浏览器历史或Web服务器日志中。因此,表单数据的提交基本上要用到POST请求。
1. 处理登录表单
我们使用作者提供的网站:http://www.santostang.com/wp-login.php。账号名:test,密码:a12345
处理登录表单可以分为两步:
(1)研究网站登录表单,构建POST请求的参数字典
(2)提交POST请求
第一步:打开网页,点击右键检查,点击左上角“鼠标”按钮,再在网页单机登录框这一区域,代码定位到登录框的位置。
定位账户名:name为key值,是log,输入值为value账户名
定位密码:name为key值,是pwd,输入值为value密码
记住登录信息:name为key值,是rememberme,value值为forever
登录部分:隐藏内容
找到这些登录需要用到的内容后,我们就可以构建表单,然后提交POST请求来登录网站了。下面是发送post请求代码。
import requests
session = requests.session()
post_url = 'http://www.santostang.com/wp-login.php'
agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
headers = {
'Host': 'www.santostang.com',
'User-Agent': agent
}
post_data = {
'pwd': 'a12345',
'log': 'test',
'rememberme': 'forever',
'redirect_to': 'http://www.santostang.com/wp-admin/',
'testcookie': 1
}
login_page = session.post(post_url, data= post_data, headers=headers)
print(login_page.status_code)
状态码:200
所需要提交的表单数据以字典的形式传递给服务器。获取请求数据。输出结果为200,请求正确。表示可以成功登录表单数据。
其他代码信息:
- 303----重定向
- 400----请求错误
- 401----未授权
- 403----禁止访问
- 404----文件未找到
- 500----服务器错
2. 处理cookie,让网页记住登录信息
cookie的作用是将登录状态记录下来,再次运行代码的时候可以直接获取之前的登录状态,不需要重新登录。当我们浏览网站时,session会跟踪我们的浏览记录并将数据存储在我们本地终端上,当重新访问该网站的时候,便会从cookies中找回之前浏览的信息,cookie也可以保存之前的登录信息,这样再次访问时,就是登录状态。使用如下代码保存cookie信息:
import requests
import http.cookiejar as cookielib
# 加载在计算机上的cookie
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename='cookies')
try:
session.cookies.load(ignore_discard=True)
except:
print("Cookie 未能加载")
def isLogin():
# 通过查看用户个人信息来判断是否已经登录
url = "http://www.santostang.com/wp-admin/profile.php"
login_code = session.get(url, headers=headers, allow_redirects=False).status_code
if login_code == 200:
return True
else:
return False
def login(secret, account):
post_url = 'http://www.santostang.com/wp-login.php'
post_data = {
'pwd': 'a12345',
'log': 'test',
'rememberme': 'forever',
'redirect_to': 'http://www.santostang.com/wp-admin/',
'testcookie': 1
}
try:
# 不需要验证码直接登录成功
login_page = session.post(post_url, data=post_data, headers=headers)
login_code = login_page.text
print(login_page.status_code)
except:
pass
session.cookies.save()
if __name__ == '__main__':
agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
headers = {
'Host': 'www.santostang.com',
'User-Agent': agent
}
if isLogin():
print("您已经登录")
else:
login('a12345', 'test')
在代码中,首先创建一个session,在session中尝试加载可能保存的cookie,如果是第一次登录,没有cookie,程序会输出“cookie未能加载”,如果cookie存在,则此步什么都没输出,然后用isLogin()访问该账户的个人信息页面,判断是否已经登录,如果已经登录,就是cookie加载成功,就直接用这个session访问其他网页获取数据。程序返回结果;您已经登录。
总结:在本片文章中,只讲述了登陆问题的处理,在书中还包括验证码的处理,这部分内容我们将在后面的学习中,在继续说。登陆问题的处理重点就是要提交哪些数据,这也是前期分析网页内容的重点。
注意:本篇学习笔记,是总结唐松老师的《Python网络爬虫从入门到实践》这本书的内容,如果想了解书中详细内容,请自行购买