什么是爬虫,java爬虫,动态爬虫

文章探讨了数据的价值,比喻为现代的石油资源,说明了数据在不同领域的应用,如消费者、企业和供应商。接着介绍了爬虫技术,包括通用爬虫和聚焦爬虫,以及它们如何模拟HTTP请求获取数据。文章还讨论了开放平台与爬虫的区别,特别是在数据获取和安全防护方面的策略,如IP限制、验证码和代理IP的使用。最后,提到了安全问题,如跨站攻击和防范措施,强调了在处理数据请求时的安全重要性。

前言

数据将成为像石油一样宝贵的资源?
在这里插入图片描述

石油通过不同的方式提取可以获得工业橡胶、柴油、汽油、航空煤油等各种不同的产物。

数据从某些方面来看是和石油一样,也是可以提炼的,不同视角去看数据会有不同的作用

比如拿到所有关于车的信息,包括车的销量,价格,购车群体信息等各种信息

  • 消费者角度:对比车的价格、质量、用户评价、品牌等相关信息,来决定要买哪一辆。

  • 车企:对比车的不同价格销量、不同供应商销量、不同的颜色销量、用户购买群体分析,分析以后发展方向。

  • 供应商:用户更喜欢什么材质的内饰,以后更多的生产哪些材料。

  • 售车顾问、二手车销售、修车商… … 他们都需要不同维度展示的关于车辆的信息。

离我们最近的爬虫

捜索引擎为什么能搜索出来这么多东西?因为他们有非常庞大的抓取系统,大家有没有注意到‘百度快照’
它是“通用爬虫”
在这里插入图片描述

另外一种叫做聚焦爬虫
聚焦爬虫是面向特定内容进行的爬虫,目的是为了满足对特定领域信息的需求.

正文

开放平台和爬虫区别

面对一个数据列表接口

  • 正常访问就可以看到数据,但是数据不能够按照批量的被拿走。

  • 开放平台是提供接口,提供调用方式,验证身份后就可以提供数据,这个可以批量获取数据,但是很多公司提供的相关服务是收费的。比如钉钉的开放平台有接口是可以给用户的钉钉发通知,chatgpt提供的接口是收费的。

爬虫是将网页视作数据来源,通过模拟请求,获取响应结果。 通过构造一个http请求获取响应内容

页面发什么内容模拟的请求也发一样的内容,他的头部带什么内容模拟的请求头部也带一样的内容,页面翻页请求也翻页。(动态爬虫)

相应的,页面响应中获取到的内容模拟的请求也能获取一样的内容,拿到数据后可以筛选获得有需要的数据。
在这里插入图片描述
在这里插入图片描述

package com.qdnsjly.spider;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.StandardHttpRequestRetryHandler;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.net.URISyntaxException;

public class MockHttpDCD {

    static CloseableHttpClient httpClient = null;

    static {
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        // 总连接池数量
        connectionManager.setMaxTotal(150);
        // 可为每个域名设置单独的连接池数量
//        connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("xx.xx.xx.xx")), 80);
        // setConnectTimeout:设置建立连接的超时时间
        // setConnectionRequestTimeout:从连接池中拿连接的等待超时时间
        // setSocketTimeout:发出请求后等待对端应答的超时时间
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(1000)
                .setConnectionRequestTimeout(2000)
                .setSocketTimeout(3000)
                .build();
        // 重试处理器,StandardHttpRequestRetryHandler
        HttpRequestRetryHandler retryHandler = new StandardHttpRequestRetryHandler();

        httpClient = HttpClients.custom().setConnectionManager(connectionManager).setDefaultRequestConfig(requestConfig)
                .setRetryHandler(retryHandler).build();
    }

    public static void main(String[] args) throws URISyntaxException, IOException {
        URIBuilder uriBuilder = new URIBuilder("https://www.dongchedi.com/motor/pc/car/brand/select_series_v2?aid=1839&app_name=auto_web_pc");
        HttpPost httpGet = new HttpPost(uriBuilder.build());
        httpGet.addHeader("content-type","application/x-www-form-urlencoded");
        httpGet.addHeader("cookie","ttwid=1%7C322xU5YuG-t4MEQVAUVZxyVvVTwAFawFhHhD3NCLVBE%7C1680152615%7C5857fde081bd6cfff9ddc69451d8e132d361c2a6a676cca803b856f83f320353; tt_webid=7216200492823987768; tt_web_version=new; is_dev=false; is_boe=false; Hm_lvt_3e79ab9e4da287b5752d8048743b95e6=1680152615; _gid=GA1.2.1083416773.1680152616; _gat_gtag_UA_138671306_1=1; s_v_web_id=verify_lfunhjw1_blQfYtGE_CVnj_4Eav_A4wl_0LYoJmAlwlM3; city_name=%E6%9D%AD%E5%B7%9E; Hm_lpvt_3e79ab9e4da287b5752d8048743b95e6=1680152634; _ga=GA1.1.862026144.1680152616; msToken=ZPiC6WtWFc_qXQghNA8N3VxwvmAkkaSUAKvfKVBPwpeM0OnSYwFHRzKMALHuegSE7_KaLMyFGBOV_z6bqWe2VDo_ijSy7-dH8CuC0i_nyK8=; _ga_YB3EWSDTGF=GS1.1.1680152615.1.1.1680152640.35.0.0");
        httpGet.addHeader("origin","https://www.dongchedi.com");
        httpGet.addHeader("pragma","no-cache");
        httpGet.addHeader("referer","https://www.dongchedi.com/auto/library/x-1-x-x-x-x-3-x-x-x-x-x-x-x-x-x-x-x");
        httpGet.addHeader("sec-ch-ua","\"Google Chrome\";v=\"111\", \"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"111\"");
        httpGet.addHeader("sec-ch-ua-platform","\"macOS\"");
        httpGet.addHeader("sec-fetch-dest","empty");
        httpGet.addHeader("sec-fetch-mode","cors");
        httpGet.addHeader("sec-fetch-site","same-origin");
        httpGet.addHeader("user-agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36");
        HttpContext context = HttpClientContext.create();
        CloseableHttpResponse response = httpClient.execute(httpGet,context);

        int statusCode = response.getStatusLine().getStatusCode();
        System.out.println(statusCode);
        HttpEntity entity = response.getEntity();
        if (null != entity) {
            String resStr = EntityUtils.toString(entity, "utf-8");
            JSONObject jsonObject = JSON.parseObject(resStr);
            System.out.println(jsonObject);
            JSONObject data = jsonObject.getJSONObject("data");
            JSONArray series = data.getJSONArray("series");
            for (Object serie : series){
                JSONObject car = JSON.parseObject(serie.toString());
                System.out.println("车企:" +car.getString("brand_name") +",车名:"+ car.getString("outter_name") +",价位区间"+ car.getString("pre_price"));
//                System.out.println(car);
            }

        }

    }
}

这里使用的是CloseableHttpClient,它是HttpClient的子接口,对比原来的httpClient优势在于可以构建多线程并发环境。(需要你把cookie换成你自己的

在爬取过程中会遇到很多的问题,因为所有网站都不希望数据被别人轻易拿走,但是又不能让真正想要访问的正常用户获取不到要看到的内容。
这个接口是可以直接获取到一个json的信息,但是如果获取到的不是json,而是一个页面,就需要用Xpath去抽取页面元素中的内容。

XPath是一门在XML和HTML文档中查找信息的语言

攻防一体:当爬虫来敲门

攻击:

通过模拟请求获取数据的过程中,迅速翻页,换参数,不停的发请求
在这里插入图片描述

防御:

1.时间段内ip限制访问次数
2.让用户登录
3.前端混淆(方法多种多样,请求加一个加密参数,或者字典码)
在这里插入图片描述

4.验证码
在这里插入图片描述

再攻击:

使用代理ip请求,每个代理ip模拟请求,分散访问次数,破ip次数限制(代理ip是收费的,根据代理ip的匿名性以及使用时间收费不等,但是可以通过不断优化代码去减少这个成本)
Selenium(Selenium是web自动化的一个工具,可以模拟一个真的浏览器,然后再模拟鼠标操作,但是缺点是太慢了,而且调用浏览器比较多消耗内存,多线程会出现卡死情况)
下载下来页面的js文件,破解混淆(需要一定的js功力)(使用webpack类似工具的打包之后代码可读性变得非常差)
在这里插入图片描述

购买第三方接口去对图片验证码解析
在这里插入图片描述

再防御:

打包做成应用:手机app,电脑app,小程序(隐藏混淆代码)
加大查封代理ip的力度(对于恶意的请求ip地址逐渐的加大力度)

攻击升级:

分布式爬虫:肉鸡(仅用来做发请求,接收数据,再将数据包传给主机)大量使用代理ip
反编译app或者小程序

防御升级:

购买专业的安全服务,由专业人士负责打理安全问题

fiddler网络代理调试工具

在这里插入图片描述

这个应用可以用来做APP抓包,因为app不像网页中的请求一样可以用f12打开开发调试面板,电脑上的应用和手机上的应用以及小程序发出请求后,如果不依靠工具很难看到请求内容。
如果遇到混淆的请求,就需要去反编译,脱壳之后看小程序或者应用的源码。

构造一只http爬虫须知
/robots.txt协议
在这里插入图片描述

User-agent: 搜索机器人的名称
Disallow: 不允许搜索机器人访问的地址
Allow: 允许搜索机器人访问的地址

我们好像可以做点什么

短信轰炸机
使用一个手机号作为请求参数访问多个可以发短信验证码的地址

拿到数据之后可以通过不同维度展示数据,以这种形式做一个网站

抢茅台

大家有没有更好的想法?

警惕违法犯罪行为

越重要的数据反爬做的越严格,但是如果是一个以内容为核心的网站,抓取一次全量的数据后就可以复刻出来。
跨站攻击(也是模拟请求)-登录后,是有cookie和session在的,如果再打开一个钓鱼网站,可能就直接发送一个转账或者别的请求,因为你的登录态还没有失效,如果没有做好防范就有可能被攻击。

安全相关需要警惕的

如果有人尝试模拟一个请求来访问接口(有正确的cookie,session)
修改,删除时要注意校验当前数据是否是当前用户的,如果很随意就写了根据主键修改,这样非常不安全 ,要根据数据是否属于操作用户再校验一下

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值