分享

使用Python进行页面模拟登录的多种方法汇总

 excel05 2022-06-22 发布于福建

模拟登录是相当于制作一个脚本控制的机器人登录网站,然后进行网页数据采集的最开始的一个环节。由于是数据分析师爬虫不要求那么高的效率,因此对于那些需要登录的站点数据采集仅仅用模拟登录就可以解决大部分的问题。

整套学习自学教程中应用的数据都是《三國志》、《真·三國無雙》系列游戏中的内容。

文章图片1

使用已知cookie登录

基本原理

cookie 保存在发起请求的客户端中,服务器利用cookie来区分不同的客户端。因为 http 是一种无状态的连接,当服务器同时收到好几个请求时,是无法判断出哪些请求是同一个客户端发起的。而 『访问登录后才能看到的页面』 这一行为恰恰需要客户端向服务器证明:『我是刚才登录过的那个客户端』。于是就需要cookie来标识客户端的身份,以存储它的信息(如登录状态)。

这也意味着只要得到了别的客户端的 cookie,就可以假冒成它来和服务器对话。比如说CSDN的登录就可以使用这个方法。

先用浏览器登录,然后使用开发者工具查看cookie。接着在程序中携带该 cookie 向网站发送请求,就能让程序假扮成刚才登录的那个浏览器,得到只有登录后才能看到的页面。

操作步骤

  1. 使用浏览器登录,打开开发者工具转到network选项卡。在左边的Name一栏找到当前的网址,选择右边的 Headers 选项卡,查看 Request Headers,这里包含了该网站颁发给浏览器的 cookie。把它复制下来一会儿代码里要用到。
  2. 最好是在运行程序前再登录。登录过早或者关闭浏览器都可能会使复制的那个 cookie 过期无效。

应用举例

以我的新浪博客举例

文章图片2
import requestsimport sys#登录后才能访问的网页url = 'http://blog.sina.com.cn/u/2929542851'#浏览器登录后得到的cookie,也就是刚才复制的字符串,复制自己的即可cookie_str = r'xxxxxxxxxxxxxxxxx'#把cookie字符串处理成字典,以便接下来使用cookies = {}for line in cookie_str.split(';'): key, value = line.split('=', 1) cookies[key] = valuecookies

模拟登录后携带cookie访问

基本原理

在程序中向网站发出登录请求,也就是提交包含登录信息的表单(用户名、密码等)。从响应中得到 cookie ,今后在访问其他页面时也带上这个 cookie ,就能得到只有登录后才能看到的页面。

操作步骤

  1. 找出表单提交到的页面还是要利用浏览器的开发者工具。
  2. 转到network选项卡,并勾选Preserve Log。
  3. 在浏览器里登录网站。
  4. 在 Name 一栏找到表单提交到的页面。Form Data 中可以看到刚才输入的用户名和密码等。
  5. 根据实际情况在Form Data里找到自己需要的数据。

应用举例

import requestsimport sysimport io# sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码#登录后才能访问的网页url = 'http://ssfw./cmstar/index.portal'#浏览器登录后得到的cookie,也就是刚才复制的字符串cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx'#把cookie字符串处理成字典,以便接下来使用cookies = {}for line in cookie_str.split(';'):    key, value = line.split('=', 1)    cookies[key] = value#设置请求头headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}#在发送get请求时带上请求头和cookiesresp = requests.get(url, headers = headers, cookies = cookies)print(resp.content.decode('utf-8'))

模拟登录session登录状态保持

基本原理

session 是会话的意思。和cookie的相似之处在于,也可以让服务器『认得』客户端。简单理解把每一个客户端和服务器的互动当作一个『会话』。既然在同一个『会话』里,服务器自然就能知道这个客户端是否登录过。

具体步骤

  • 找出表单提交到的页面。
  • 找出要提交的数据。

应用举例

import requestsimport sysimport io#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码#登录时需要POST的数据填写你自己注册的信息data = {'Login.Token1':'学号', 'Login.Token2':'密码', 'goto:http':'//ssfw./cmstar/loginSuccess.portal', 'gotoOnFail:http':'//ssfw./cmstar/loginFailure.portal'}#设置请求头headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}#登录时表单提交到的地址(用开发者工具可以看到)login_url = 'http://ssfw./cmstar/userPasswordValidate.portal'#构造Sessionsession = requests.Session()#在session中发送登录请求,此后这个session里就存储了cookie#可以用print(session.cookies.get_dict())查看resp = session.post(login_url, data)#登录后才能访问的网页url = 'http://ssfw./cmstar/index.portal'#发送访问请求resp = session.get(url)print(resp.content.decode('utf-8'))

使用浏览器模拟器访问

基本原理

模拟器几乎可以对付任何网页,但会导致代码效率低。如果能在程序里调用一个浏览器来访问网站,那么像登录这样的操作就轻而易举了。

在Python中可以使用Selenium库来调用浏览器,写在代码里的操作(打开网页、点击……)会变成浏览器忠实地执行。这个被控制的浏览器可以是Firefox,Chrome等,但最常用的还是PhantomJS这个无头(没有界面)浏览器。

只要把填写用户名密码、点击『登录』按钮、打开另一个网页等操作写到程序中,PhamtomJS 就能登录上去,并返回响应。

操作步骤

  • 安装 selenium 库、PhantomJS 浏览器驱动。
  • 在源代码中找到登录时的输入文本框、按钮这些元素。因为要在无头浏览器中进行操作,所以就要先找到输入框,才能输入信息。找到登录按钮,才能点击它。在浏览器中打开填写用户名密码的页面,将光标移动到输入用户名的文本框,右键,选择“审查元素”,就可以在右边的网页源代码中看到文本框是哪个元素。同理,可以在源代码中找到输入密码的文本框、登录按钮。
  • 考虑如何在程序中找到上述元素,Selenium库提供了find_element(s)_by_xxx的方法来找到网页中的输入框、按钮等元素。其中xxx可以是id、name、tag_name(标签名)、class_name(class),也可以是xpath(xpath表达式)等等。当然还是要具体分析网页源代码。
文章图片3

应用举例

import requestsimport sysimport iofrom selenium import webdriver#建立Phantomjs浏览器对象,括号里是phantomjs.exe在你的电脑上的路径browser = webdriver.PhantomJS('x:/phantomjs.exe')#登录页面url = r'http://ssfw./cmstar/index.portal'# 访问登录页面browser.get(url)# 等待一定时间,让js脚本加载完毕browser.implicitly_wait(3)#输入用户名username = browser.find_element_by_name('user')username.send_keys('学号')#输入密码password = browser.find_element_by_name('pwd')password.send_keys('密码')#选择“学生”单选按钮student = browser.find_element_by_xpath('//input[@value='student']')student.click()#点击“登录”按钮login_button = browser.find_element_by_name('btn')login_button.submit()#网页截图browser.save_screenshot('picture1.png')#打印网页源代码print(browser.page_source.encode('utf-8').decode())browser.quit()

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多