首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >终于还是对TA下了手!小白教学:模拟登陆网站并爬取信息

终于还是对TA下了手!小白教学:模拟登陆网站并爬取信息

作者头像
beifengtz
发布于 2019-09-09 07:43:22
发布于 2019-09-09 07:43:22
1.2K00
代码可运行
举报
文章被收录于专栏:北风IT之路北风IT之路
运行总次数:0
代码可运行

前言

相信很多读者多多少少都玩过模拟登陆某某网站、爬取某某网站数据等等,对于高手来说这篇文章简直是小菜一碟,不过对于入门级程序猿来说可能将会是ta跨入网络编程的第一步,相信对于小白的你看了这篇文章你肯定会对网络编程产生极大的兴趣。

注意!!!本文仅仅是技术分享,请不要滥用该技术做任何非法的事情!

研究目标网站

因为小编之前发了一条朋友圈,模拟登陆了学校的教务网,获取到个人信息,引发了很多刚入门编程的师弟师妹关注,所以这里也以学校教务网作为目标网站作为示例,不过还是得提醒一下广大小白程序员:非法爬取政府、教育、商业等机构网站信息是属于违法行为!这里虽以教务网作为示例网站,但是获取的信息仅是小编本人的个人信息,不涉及任何其他信息,所以小白在学的时候注意哦,不要随便爬别人网站的数据~~~

我们先使用chrome浏览器打开目标网站http://jiaowu.****.cn,找到它的登录模块,按F12打开浏览器控制台,使用元素选择器选中登录模块。

然后分析其中登录时需要传输的数据,传输形式不同网站会有所不同,有的是前后端分离的网站,请求数据可能是通过Ajax异步请求,而有的则可能是form表单请求,有的或许是使用ES6的Fetch请求。模拟登录的过程实际就是模拟请求的过程,只要是按照后台请求的格式以及对方的信任数据就可以模拟此过程(当然对于有身份验证的无法模拟,比如https)。

就拿目标网站的登录模块来说,它是使用最老的一种方式:form表单请求,这种也是最容易模拟的,所以比较方便演示。我们先展开登录的form表单所有的html代码。

在input标签中name则为请求数据的key,其对应的value就是需要传的值,不难发现其中的无非就是以下几个参数:

  1. user:你的学号或工号
  2. pwd:你的密码
  3. lb:你的登录角色
  4. sign:隐藏表单域,用于验证身份(一般网站通过定期修改这个值来避免脚本登陆)

然后咱们再来看form表单身份认证请求的地址和类型,这些信息都在form表单中,你直接看html就可以获取到。稍微麻烦一点的话可能有的网站会把这些信息隐藏在js文件里面,然后对js文件编码压缩,可能你找的过程需要麻烦一些,不过嘿嘿,再复杂再麻烦都难不倒咱们程序员的,只要你的这些数据放在前端文件里,总能找到的。

好了这里的数据便一目了然:

  1. 请求地址:http://jiaowu.****.cn/jiaoshi/bangong/check.asp
  2. 请求方法:POST

我们拿到了这些信息之后还不够,你需要查看其中获取的cookie,所有的这些数据传输、cookie信息、请求头信息等都可以通过网络抓包去查看,只要请求的数据包没有经过加密,你都能看到。网上抓包工具非常多,你们百度或谷歌一下就知道啦,这里就不展示抓包的过程。

经过小编探路,已经得知,身份认证的cookie数据需要来源于当前页面下发的cookie,你可以通过在控制台点击Application -> Cookies查看这个页面所有的cookie,在下发的cookie中有一个是用于时间验证,只要在有效时间内认证均是被允许的。除此之外你还可以通过获取下发当前页面的网络请求头和响应头数据查看cookie信息,位置在控制台Network -> index.asp

好啦,基本上需要模拟登录的信息已经掌握了,接下来我们就开始编码吧

代码实现

不同语言实现不一样,不过逻辑思路都是一致的,无论你是使用Java还是Python,还是C++或Go,只要支持网络编程的语言都可以实现。这里小编用Java来做,Java的网络编程API以及各种库实在是太多,为了让小白的你看的更清晰易懂,这里使用Jsoup来展示。

首先你需要创建一个Maven项目(不知道怎么建的自信百度哦~),引入Jsoup的Maven或Gradle依赖,这里以Maven为例(Gradle依赖可自信改写或查看官方文档来添加)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.11.2</version>
</dependency>

然后建立你的测试类开始编码,上面分析已经很明白了,要模拟登录需要请求地址、请求方法、请求数据以及Cookie,而cookie是在请求主页的时候才会下发,所以总共我们需要两次请求,第一次请求先获取cookie,第二次请求才是真正的模拟登录,所以显示第一次请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String url = "http://jiaowu.****.cn";// 主页地址
Connection con = Jsoup.connect(url); //建立连接

Connection.Response rs = con.postDataCharset("UTF-8").execute();// 获取响应
rs.charset("UTF-8");//  设置响应编码
Map<String, String> cookies = rs.cookies();//   我们需要拿到的cookie

然后就是准备好我们的数据以及cookie来请求登录认证的地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Connection con2 = Jsoup.connect("http://jiaowu.****.cn/jiaoshi/bangong/check.asp");//   身份认证的地址
Map<String, String> data = new HashMap<>(); //  设置post的数据

data.put("user", "201*****");
data.put("lb", "S");
data.put("pwd", "******");
data.put("sign", "c4f986961b0ffe8d521548678ae5b586");
con.data(data);
Connection.Response login = con2.ignoreContentType(true)
        .postDataCharset("UTF-8")
        .method(Connection.Method.POST)
        .cookies(cookies)
        .data(data)
        .header("Upgrade-Insecure-Requests", "1")
        .execute();
login.charset("UTF-8");

好了,现在我们就拿到了响应的对象,为了检测是否登录成功,你可以打印一下响应返回给你的dom树:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Document doc = login.parse();
System.out.println(doc);

如果你能打印出正常的dom树说明你就已经完成了模拟登录,通过在自己计算机上就可以登录,而不需要进入网站。

只要你拿到了这个网站的认证数据,那么你就可以在接下来做任何你的权限范围内所做的事情,比如获取课表信息、项目信息等。

因为学校的教务网做的比较简单,个人信息全是放在cookie中,所以你不需要进行第三次请求就可以获取到自己的个人信息。当然这也就警示广大学弟学妹,不要随便在其他未认证的网站中登录自己的账号

接下来是解析第二次请求的cookie内容,学校的教务网对字符串进行了url编码,有小伙伴可能以为这是乱码,其实它就是明文并不是乱码,经过简单的url解码即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String,String> cookie = login.cookies();
cookie.forEach(new BiConsumer<String, String>() {
    @Override
    public void accept(String s1, String s2) {
        try {
            System.out.println(String.format("%s = %s", decode(s1), decode(s2)));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
});

//  url解码
private static String decode(String url) throws UnsupportedEncodingException{
    String prevURL = "";
    String decodeURL = url;
    while (!prevURL.equals(decodeURL)) {
        prevURL = decodeURL;
        decodeURL = URLDecoder.decode(decodeURL, "UTF-8");
    }
    return decodeURL;
}

完整的代码和执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;

/**
 * @Author beifengtz
 * @Site www.beifengtz.com
 * @Date Created in 22:35 2019/9/4
 * @Description:
 */
public class JsoupHtmlTest {
    public static void main(String[] args) throws IOException {
        String url = "http://jiaowu.****.cn/web/web/web/index.asp";
        Connection con = Jsoup.connect(url); //建立连接

        Connection.Response rs = con.postDataCharset("UTF-8").execute();// 获取响应
        rs.charset("UTF-8");
        Map<String, String> cookies = rs.cookies();

        Connection con2 = Jsoup.connect("http://****.edu.cn/jiaoshi/bangong/check.asp");
        Map<String, String> data = new HashMap<>(); //  设置post的数据

        data.put("user", "201*****");
        data.put("lb", "S");
        data.put("pwd", "******");
        data.put("sign", "c4f986961b0ffe8d521548678ae5b586");
        con.data(data);
        Connection.Response login = con2.ignoreContentType(true)
                .postDataCharset("UTF-8")
                .method(Connection.Method.POST)
                .cookies(cookies)
                .data(data)
                .header("Upgrade-Insecure-Requests", "1")
                .execute();
        login.charset("UTF-8");
        //  Document doc = login.parse();
        //  System.out.println(doc);
        Map<String, String> cookie = login.cookies();
        cookie.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String s1, String s2) {
                try {
                    System.out.println(String.format("%s = %s", decode(s1), decode(s2)));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    //  url解码
    private static String decode(String url) throws UnsupportedEncodingException {
        String prevURL = "";
        String decodeURL = url;
        while (!prevURL.equals(decodeURL)) {
            prevURL = decodeURL;
            decodeURL = URLDecoder.decode(decodeURL, "UTF-8");
        }
        return decodeURL;
    }

    //  url编码
    private static String encode(String url) throws UnsupportedEncodingException {
        return URLEncoder.encode(url, "UTF-8");
    }
}

执行结果:

可以看到里面还是有一些很重要的数据,包括密码!!!通过本文的阅读你不但可以了解模拟登录和爬虫相关的知识,同时你也应该具备有一定的安全意识,不只是学校的网站,千万不要随便在别人网站上登录,因为很可能你一登录自己的信息就被别人记录咯~~~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北风IT之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java模拟登陆爬虫 原
1、添加依赖 <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.9.2</version> </dependency> 2、示例代码 package com.neo; import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import ja
wuweixiang
2018/09/13
1.9K0
网页爬虫小记:两种方式的爬取网站内容
此处进行简单的分类,对于普通的网页爬取内容,如果没有登录界面可以直接使用Jsoup的API进行爬取;
小勇DW3
2018/10/11
8530
网页爬虫小记:两种方式的爬取网站内容
Python模拟登陆新版知乎
目前网上很多模拟登录知乎的代码已经无法使用,即使是二、三月的代码也已经无法模拟登陆知乎,所以我现在将新版知乎的模拟登录代码和讲解发布出来。
喵叔
2020/09/08
9680
模拟登陆我终于还是进了
爬了这么久的教务处,终于还是绕过了千山万水登进来了。 这段时间准备期末考,忙,好久不更博。 年终总结也没有写。 是时候开更啦!
一点儿也不潇洒
2018/08/07
5830
Python3网络爬虫(六):Python3使用Cookie-模拟登陆获取妹子联系方式
根据用户输入的网址,使用requests库向目标网站发起请求,获取对应的内容。然后使用BeautifulSoup对获取到的HTML代码进行解析,提取出邮件地址。最后将提取到的邮件地址保存到文件中。
Jack_Cui
2018/01/08
2K0
Python3网络爬虫(六):Python3使用Cookie-模拟登陆获取妹子联系方式
左手用R右手Python系列——模拟登陆教务系统
最近在练习R语言与Python的网络数据抓取内容,遇到了烦人的验证码问题,走了很多弯路,最终总算解决了。 在分享这篇文章之前,只想感慨一声,虽然Python拥有更为完善的爬虫生态和多如牛毛的爬虫分享课程,但是貌似这些大部分内容,使用R语言中的RCurl+httr都可以做到,但是可惜的利用R语言学习爬虫的爱好者与Pythoner相比,实在是太少了,R语言的高阶爬虫教程凤毛麟角,只能一点一点儿在stackflow上面搜罗整理。 希望我的这一篇案例能给大家带来一点儿可借鉴的思路。 R library("RCurl
数据小磨坊
2018/04/11
1.6K0
左手用R右手Python系列——模拟登陆教务系统
使用Selenium与Requests模拟登陆
注意两个地方,cookies和参数,先来看看参数,稍微特别的就是authenticity_token,感觉是验证。Ctrl+Shift+F打开搜索,最终在返回的html中找到
小歪
2018/07/25
1.5K0
使用Selenium与Requests模拟登陆
[387]scrapy模拟登陆
通过scrapy.FormRequest能够发送post请求,同时需要添加fromdata参数作为请求体,以及callback
周小董
2022/04/12
1K0
[387]scrapy模拟登陆
Java数据采集-8.模拟登录
当我们对某些网站进行一些特定操作时,如知乎的点赞,会要求我们登录,这时候一些简单的做法就是粘贴浏览器请求中的Cookie信息,但作为自动化的程序来讲,这个方法明显不可行。因此就有了模拟登录的需求。 注:至于Cookie是什么,在网页请求时有什么用,不在本文讨论范围,自行Google吧。
geekfly
2022/05/06
6740
Java数据采集-8.模拟登录
知乎模拟登陆
经常在简书上写作,写完后再发布到其他网站,非常麻烦,所以准备搞一下自动发布文章的工具。那么第一步先要模拟登陆几个网站。今天先从知乎开始。
星星在线
2018/08/21
2.2K0
知乎模拟登陆
Python模拟登陆 —— 征服验证码 2 B站
B站的登录密码用了rsa加密(两个大质数的乘积很难进行逆向分解,所以可以用这个乘积来做公钥)。 所以运行py文件之前,使用镜像,先用pip安装rsa库: pip install rsa -i https://pypi.tuna.tsinghua.edu.cn/simple/ 运行: import requests import re import time import sys import json import rsa import os.path import binascii import d
SeanCheney
2018/04/24
1K0
Python模拟登陆 —— 征服验证码 2 B站
用Python模拟登陆GitHub并获取信息
最近在研究如何对搜狗搜索公众号文章进行爬取,由于需要用到Cookies,所以这回先了解下Cookies的相关知识。
小F
2020/10/09
1.2K0
用Python模拟登陆GitHub并获取信息
python模拟新浪微博登陆功能(新浪微博爬虫)
有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录。 浏览器访问服务器的过程 在用户访问网页时,不论是通过URL输入域名或IP,还是点击链接,浏览器向WEB服务器发出了一个HTTP请求(Http Request),WEB服务器接收到客户端浏览器的请求之后,响应客户端的请求,发回相应的响应信息(Http Response),浏览器解析引擎,排版引擎分析返回的内容,呈现给用户。WEB应用程序在于服务器交互的过程中,HTTP请求和响应时发送的都是一
机器学习AI算法工程
2018/03/13
3.4K0
python模拟新浪微博登陆功能(新浪微博爬虫)
Python爬虫模拟登录带验证码网站
本篇主要介绍了Python爬虫学习--Python爬虫模拟登录带验证码网站,通过具体的内容展现,希望对Python爬虫的学习有一定的帮助。
conanma
2021/11/01
2.9K0
Python爬虫之scrapy模拟登陆
scrapy中start_url是通过start_requests来进行处理的,其实现代码如下
海仔
2020/09/28
1.6K0
Python模拟登录的几种方法(转)
原文网址:https://www.cnblogs.com/chenxiaohan/p/7654667.html
十四君
2019/11/24
1.8K0
Python模拟登录的几种方法(转)
python 自动登陆网页原理
有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录。 
py3study
2020/01/08
2.1K0
模拟登陆CSDN——就是这么简单「建议收藏」
本篇文章主要是解说怎样模拟登陆CSDN。使用的工具是HttpClient+Jsoup
全栈程序员站长
2022/07/10
5370
模拟登陆CSDN——就是这么简单「建议收藏」
【说站】python scrapy模拟登录的方法
以上就是python scrapy模拟登录的方法,希望对大家有所帮助。更多Python学习指路:python基础教程
很酷的站长
2022/11/23
7510
【说站】python scrapy模拟登录的方法
Python模拟登陆[通俗易懂]
模拟登陆的时候是post请求。提交表单的地址和人人界面登陆地址是不一样的,实际是人人界面的登陆地址。也就是wwww.renren.cm.你输入你的信息以后它会自己主动跳转到
全栈程序员站长
2022/07/08
1.2K0
Python模拟登陆[通俗易懂]
相关推荐
java模拟登陆爬虫 原
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档