Java模拟登录并抓取数据
问题:
最近做一个抓取数据的项目,发现网上很多资料不完备,或者按照代码执行不能真实爬取数据,自己特别根据自己的网站进行登录并进行数据爬取。
未登录
登录后,正常抓取数据截图(预期目标数据)
解决办法:
(1)找到登录接口,并利用程序抓取数据。
我这里接口是
http://192.168.1.119/blog11/login/login3.shtml?username=xxx&password=xxx
(2)利用okhttp3模拟登录并抓取数据。
https://mvnrepository.com/ mvn仓库
需要引入的jar包,okhttp-4.9.1.jar,kotlin-stdlib-1.5.0-M2.jar,okio-2.10.0.jar
依赖地址:
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib -->
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.5.0-M2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.okio/okio -->
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>2.10.0</version>
</dependency>
package com.game.test;import java.util.ArrayList;
import java.util.List;import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;/*** 模拟登陆请求并抓数据* * @author Leng**/
public class OkTest3 {public static void main(String[] args) {long s1 = System.currentTimeMillis();try {OkHttpClient okHttpClient = new OkHttpClient().newBuilder().cookieJar(new CookieJar() {private List<Cookie> listCookie = new ArrayList<>();@Overridepublic void saveFromResponse(HttpUrl arg0, List<Cookie> arg1) {listCookie = arg1;}@Overridepublic List<Cookie> loadForRequest(HttpUrl arg0) {return listCookie;}}).build();{System.out.println("----------------登录------------------");String url = "http://192.168.1.119/blog11/login/login3.shtml";RequestBody formBody = new FormBody.Builder().add("lang_type", "zh-cn").add("username", "admin").add("password", "111111").build();final Request request = new Request.Builder().url(url).post(formBody)// 默认就是GET请求,可以不写.build();// Call call = okHttpClient.newCall(request);Response response = okHttpClient.newCall(request).execute();String result = response.body().string();System.out.println(result);}long s2 = System.currentTimeMillis();{System.out.println("--------------获取数据--------------------");String url2 = "http://192.168.1.119/blog11/setting/getMySetting.shtml";final Request request2 = new Request.Builder().url(url2).get() //模拟浏览器添加的header可写可不写,是为了虚构爬虫的身份.header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36").addHeader("Content-Type", "application/x-www-form-urlencoded").addHeader("Upgrade-Insecure-Requests", "1")// 默认就是GET请求,可以不写.build();Response response2 = okHttpClient.newCall(request2).execute();String result2 = response2.body().string();System.out.println(result2);}long s3 = System.currentTimeMillis();System.out.println("----登陆耗时:" + (s2 - s1) + " 毫秒,获取数据耗时:" + (s3 - s2) + " 毫秒");} catch (Exception e) {// TODO: handle exception}}}
执行抓取数据结果:
衍生问题:爬虫需要经常切换IP怎么办?
使用代理IP进行抓取数据如下
{OkHttpClient okHttpClient = new OkHttpClient().newBuilder().cookieJar(new CookieJar() {private List<Cookie> listCookie = new ArrayList<>();@Overridepublic void saveFromResponse(HttpUrl arg0, List<Cookie> arg1) {listCookie = arg1;}@Overridepublic List<Cookie> loadForRequest(HttpUrl arg0) {return listCookie;}}).proxySelector(new ProxySelector() {@Overridepublic List<Proxy> select(URI uri) {
// if (uri.getHost().endsWith("")) {List<Proxy> proxyList = new ArrayList<>();proxyList.add(new Proxy(Proxy.Type.HTTP,new InetSocketAddress("180.97.250.22",10290)));return proxyList;
// } else {
// return null;
// }}@Overridepublic void connectFailed(URI uri, SocketAddress sa, IOException ioe) {// TODO Auto-generated method stub}}).build();
如何获取动态IP,请查看《java爬虫技术(IP代理)》:java爬虫技术(IP代理)_逆水行舟没有退路的博客-CSDN博客_java 代理ip爬虫
衍生问题:设置超时时间
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.callTimeout(120, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
Java模拟登录并抓取数据相关推荐
- pythonurllib新浪微博_python模拟登录新浪微博抓取数据(cookielib和urllib2).doc
HYPERLINK "/article/python/22972.html" /article/python/22972.html python模拟登录新浪微博抓取数据(cooki ...
- 微博pythonurllib登陆是什么_python模拟登录新浪微博抓取数据(cookielib和urllib2)
http是无连接的状态协议,但是客户端和服务器端需要保持一些相互信息,比如cookie,有了cookie,服务器才能知道刚才是这个用户登录了网站,才会给予客户端访问一些页面的权限. 用浏览器登录新浪微 ...
- 模拟web访问有登录且有验证码的登录后抓取数据
模拟web访问有登录且有验证码的登录后抓取数据 1 取验证码 1 在窗体上放一个picturebox (imgValidate)存放获取的验证码图片, 2 用浏览器的开发者工具firefox (f12 ...
- java模拟新浪微博_Java模拟新浪微博登陆抓取数据
前言: 兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先: 要想登陆新浪微博需要预登 ...
- 模拟微信浏览器抓取数据
步骤: 1. 配置谷歌浏览器,按f12进入检查,右下角点击选择settings 2. 选择device,点击add 3. 填写userAgent 微信安卓UA Mozilla/5.0 (Linux; ...
- java模拟登陆系统_Java模拟登录系统抓取内容【转载】
1 @Component2 public class Login extendsBaseJobs {3 4 SimpleDateFormat sdf = new SimpleDateFormat(&q ...
- Scrapy模拟登陆豆瓣抓取数据
由于豆瓣网站是反爬虫的,因此要破解反爬虫和模拟登录,还有需要破解验证码. 1创建项目 (在pycharm中创建scrapy爬虫工程即可) scrapy startproject douban 其中d ...
- 网络爬虫-模拟手机浏览器抓取数据
有些网站的数据在PC端很复杂,参数加密很严重,但是移动APP端的就没那么多加密,所以在遇到有些瓶颈的情况下,可以考虑从网页端转到移动端去抓包,爬取数据.这里有两种方法: 一. 使用模拟器下载APP 如 ...
- 利用cookie进行模拟登录并且抓取失败
首先是朋友发现每次对撞md5都要上网站登录然后进行对撞,感觉好麻烦,想写一个脚本,输入md5值直接输出 然后就上车了 1 模拟登录 老规矩,先要提交表单,进行抓包(我用的fiddler)进行抓包,看见 ...
最新文章
- Asp.net 随记 Part1 (1- 30)
- [caffe]深度学习之图像分类模型AlexNet解读
- 后端技术:命名不规范,lombok泪两行!
- 使用集合映射和关联关系映射_使用R进行基因ID映射
- 云图说|ROMA演进史:一个ROMA与应用之间不得不说的故事
- git stash后怎么恢复_苹果换卡后怎么恢复通讯录?两种方法帮你解决
- 内存检查工具valgrind介绍、安装与使用
- 国密算法和GmSSL介绍
- Flutter 本地数据库sqflite实战操作
- 我的c盘为多余的java.exejavaw.exe_java.exe,javac.exe,javaw.exe 是什么进程?
- 大数据该挖掘,主要挖掘什么,什么是文本挖掘?
- 网络爬虫pandas
- Cesium原理篇:5最长的一帧之影像
- ABP VNext学习日记18
- U盘安装CentOS7 解决各种问题
- 尚硅谷-微信小程序文档
- 如何制作个人的纯手写电子签名
- java JFreechart开发报表的实例demo下载
- 开源协议 - 几张开源协议比较
- c语言学生学籍管理程序,C语言实现简单学籍管理系统