前言
数据将成为像石油一样宝贵的资源?
石油通过不同的方式提取可以获得工业橡胶、柴油、汽油、航空煤油等各种不同的产物。
数据从某些方面来看是和石油一样,也是可以提炼的,不同视角去看数据会有不同的作用
比如拿到所有关于车的信息,包括车的销量,价格,购车群体信息等各种信息
-
消费者角度:对比车的价格、质量、用户评价、品牌等相关信息,来决定要买哪一辆。
-
车企:对比车的不同价格销量、不同供应商销量、不同的颜色销量、用户购买群体分析,分析以后发展方向。
-
供应商:用户更喜欢什么材质的内饰,以后更多的生产哪些材料。
-
售车顾问、二手车销售、修车商… … 他们都需要不同维度展示的关于车辆的信息。
离我们最近的爬虫
捜索引擎为什么能搜索出来这么多东西?因为他们有非常庞大的抓取系统,大家有没有注意到‘百度快照’
它是“通用爬虫”
另外一种叫做聚焦爬虫
聚焦爬虫是面向特定内容进行的爬虫,目的是为了满足对特定领域信息的需求.
正文
开放平台和爬虫区别
面对一个数据列表接口
-
正常访问就可以看到数据,但是数据不能够按照批量的被拿走。
-
开放平台是提供接口,提供调用方式,验证身份后就可以提供数据,这个可以批量获取数据,但是很多公司提供的相关服务是收费的。比如钉钉的开放平台有接口是可以给用户的钉钉发通知,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();// 重试处理器,StandardHttpRequestRetryHandlerHttpRequestRetryHandler 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)
修改,删除时要注意校验当前数据是否是当前用户的,如果很随意就写了根据主键修改,这样非常不安全 ,要根据数据是否属于操作用户再校验一下