最近因为某些缘由,须要用到Python模拟登陆网站,可是之前对这块并不了解,并且目标网站的登陆方法较为复杂, 因此一下卡在这里了,因而我决定从简单的模拟开始,逐渐深刻地研究下这块。html
注:本文仅为交流学习所用。python
会话对象requests.Session可以跨请求地保持某些参数,好比cookies,即在同一个Session实例发出的全部请求都保持同一个cookies,而requests模块每次会自动处理cookies,这样就很方便地处理登陆时的cookies问题。在cookies的处理上会话对象一句话能够顶过好几句urllib模块下的操做。即至关于urllib中的:cookie
cj = http.cookiejar.CookieJar() pro = urllib.request.HTTPCookieProcessor(cj) opener = urllib.request.build_opener(pro) urllib.request.install_opener(opener)
本篇文章的任务是利用request.Session模拟登陆V2EX(http://www.v2ex.com/)这个网站,即V站。session
工具: Python 3.5,BeautifulSoup模块,requests模块,Chrome工具
这个网站登陆的时候抓到的数据以下:post
其中用户名(u)、密码(p)都是明文传输的,很方便。once的话从分析登陆URL: http://www.v2ex.com/signin 的源文件(下图)能够看出,应该是每次登陆的特有数据,咱们须要提早把它抓出来再放到Form Data里面POST给网站。学习
抓出来仍是老方法,用BeautifulSoup神器便可。这里又学到一种抓标签里面元素的方法,好比抓上面的"value",用soup.find('input',{'name':'once'})['value']便可网站
即抓取含有 name="once"的input标签中的value对应的值。ui
因而构建postData,而后POST。url
怎么显示登陆成功呢?这里经过访问 http://www.v2ex.com/settings 便可,由于这个网址没有登陆是看不了的:
通过上面的分析,写出源代码(参考了alexkh的代码):
import requests from bs4 import BeautifulSoup url = "http://www.v2ex.com/signin" UA = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.13 Safari/537.36" header = { "User-Agent" : UA, "Referer": "http://www.v2ex.com/signin" } v2ex_session = requests.Session() f = v2ex_session.get(url,headers=header) soup = BeautifulSoup(f.content,"html.parser") once = soup.find('input',{'name':'once'})['value'] print(once) postData = { 'u': 'whatbeg', 'p': '*****', 'once': once, 'next': '/' } v2ex_session.post(url, data = postData, headers = header) f = v2ex_session.get('http://www.v2ex.com/settings',headers=header) print(f.content.decode())
而后运行发现成功登陆:
上面趴下来的网页源代码即为http://www.v2ex.com/settings的代码。这里once为91279.
至此,登陆成功。