问题:

最近做一个抓取数据的项目,发现网上很多资料不完备,或者按照代码执行不能真实爬取数据,自己特别根据自己的网站进行登录并进行数据爬取。

未登录

登录后,正常抓取数据截图(预期目标数据)

解决办法

(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模拟登录并抓取数据相关推荐

  1. pythonurllib新浪微博_python模拟登录新浪微博抓取数据(cookielib和urllib2).doc

    HYPERLINK "/article/python/22972.html" /article/python/22972.html python模拟登录新浪微博抓取数据(cooki ...

  2. 微博pythonurllib登陆是什么_python模拟登录新浪微博抓取数据(cookielib和urllib2)

    http是无连接的状态协议,但是客户端和服务器端需要保持一些相互信息,比如cookie,有了cookie,服务器才能知道刚才是这个用户登录了网站,才会给予客户端访问一些页面的权限. 用浏览器登录新浪微 ...

  3. 模拟web访问有登录且有验证码的登录后抓取数据

    模拟web访问有登录且有验证码的登录后抓取数据 1 取验证码 1 在窗体上放一个picturebox (imgValidate)存放获取的验证码图片, 2 用浏览器的开发者工具firefox (f12 ...

  4. java模拟新浪微博_Java模拟新浪微博登陆抓取数据

    前言: 兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先: 要想登陆新浪微博需要预登 ...

  5. 模拟微信浏览器抓取数据

    步骤: 1. 配置谷歌浏览器,按f12进入检查,右下角点击选择settings 2. 选择device,点击add 3. 填写userAgent 微信安卓UA Mozilla/5.0 (Linux; ...

  6. java模拟登陆系统_Java模拟登录系统抓取内容【转载】

    1 @Component2 public class Login extendsBaseJobs {3 4 SimpleDateFormat sdf = new SimpleDateFormat(&q ...

  7. Scrapy模拟登陆豆瓣抓取数据

    由于豆瓣网站是反爬虫的,因此要破解反爬虫和模拟登录,还有需要破解验证码. 1创建项目 (在pycharm中创建scrapy爬虫工程即可) scrapy  startproject douban 其中d ...

  8. 网络爬虫-模拟手机浏览器抓取数据

    有些网站的数据在PC端很复杂,参数加密很严重,但是移动APP端的就没那么多加密,所以在遇到有些瓶颈的情况下,可以考虑从网页端转到移动端去抓包,爬取数据.这里有两种方法: 一. 使用模拟器下载APP 如 ...

  9. 利用cookie进行模拟登录并且抓取失败

    首先是朋友发现每次对撞md5都要上网站登录然后进行对撞,感觉好麻烦,想写一个脚本,输入md5值直接输出 然后就上车了 1 模拟登录 老规矩,先要提交表单,进行抓包(我用的fiddler)进行抓包,看见 ...

最新文章

  1. Asp.net 随记 Part1 (1- 30)
  2. [caffe]深度学习之图像分类模型AlexNet解读
  3. 后端技术:命名不规范,lombok泪两行!
  4. 使用集合映射和关联关系映射_使用R进行基因ID映射
  5. 云图说|ROMA演进史:一个ROMA与应用之间不得不说的故事
  6. git stash后怎么恢复_苹果换卡后怎么恢复通讯录?两种方法帮你解决
  7. 内存检查工具valgrind介绍、安装与使用
  8. 国密算法和GmSSL介绍
  9. Flutter 本地数据库sqflite实战操作
  10. 我的c盘为多余的java.exejavaw.exe_java.exe,javac.exe,javaw.exe 是什么进程?
  11. 大数据该挖掘,主要挖掘什么,什么是文本挖掘?
  12. 网络爬虫pandas
  13. Cesium原理篇:5最长的一帧之影像
  14. ABP VNext学习日记18
  15. U盘安装CentOS7 解决各种问题
  16. 尚硅谷-微信小程序文档
  17. 如何制作个人的纯手写电子签名
  18. java JFreechart开发报表的实例demo下载
  19. 开源协议 - 几张开源协议比较
  20. c语言学生学籍管理程序,C语言实现简单学籍管理系统

热门文章

  1. JVM优化Java代码时都做了什么?
  2. VTK 项目一:MPR和STL+感兴趣勾画
  3. Android开发之Widget桌面时钟
  4. 查询计算机系的读者信息,简单查询
  5. i3处理器_英特尔处理器对比:i3超i7
  6. 迭代算法和递归算法举例
  7. Linux内存管理子系统——mmap内存映射原理分析(dax文件系统的mmap)
  8. 数组的 reduce方法
  9. grub命令 u盘安装linux,Linux实现U盘启动(1.GRUB安装U盘)
  10. 原生小程序Tabbar底部加购物车