ope足彩_ope体育投注_ope体育在线投注
ope足彩

膀胱,倒车入库视频-ope足彩_ope体育投注_ope体育在线投注

admin admin ⋅ 2019-12-12 19:58:10

屏蔽爬虫程序是资源网站的一种维护办法,最常用的反爬虫战略应该是依据用户的拜访行为。比方约束每台服务器在必定的时间内只能拜访 X 次,超越该次数就以为这是爬虫程序进行的拜访,依据用户拜访行为判别是否是爬虫程序也不止是依据拜访次数,还会依据每次恳求的User Agent 恳求头、每次拜访的间隔时间等。总的来说是由多个因数决议的,其间以拜访次数为主。

反爬虫是每个资源网站自保的办法,旨在维护资源不被爬虫程序占用。例如咱们前面运用到的豆瓣网,它会依据用户拜访行为来屏蔽掉爬虫程序,每个 IP 在每分钟拜访次数到达必定次数后,后边一段时间内的恳求回来直接回来 403 过错,以为着你没有权限拜访该页面。所以咱们今日再次拿豆瓣网为例,咱们用程序模拟出这个现象,下面是我编写的一个收集豆瓣电影的程序

/**
* 收集豆瓣电影
*/
public class CrawlerMovie {
public static void main(String[] args) {
try {
CrawlerMovie crawlerMovie = new CrawlerMovie();
// 豆瓣电影链接
List movies = crawlerMovie.movieList();
//创立10个线程的线程池
ExecutorService exec = Executors.newFixedThreadPool(10);
for (String url : movies) {
//履行线程
exec.execute(new CrawlMovieThread(url));
}
//线程封闭
exec.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 豆瓣电影列表链接
* 选用反向解析法
*
* @return
*/
public List movieList() throws Exception {
// 获取100条电影链接
String url = "https://movie.douban.com/j/search_subjects?type=movie&tag=抢手&sort=recommend&page_limit=200&page_start=0";
CloseableHttpClient client = HttpClients.createDefault();
List movies = new ArrayList<>(100);
try {
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = client.execute(httpGet);
System.out.println("获取豆瓣电影列表,回来验证码:" + response.getS赤铁之心tatusLine().getStatusCode());
if (response.getStatusLine().ge老挝天气预报15天tStatusCode() == 200) {
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity, "utf-8");
// 将恳求成果格局化成jso迈克尔马拉基n
JSONObject jsonObject = JSON.parseObject(body);
JSONArray data = jsonObject.getJSONArray("subjects");
for (int i = 0; i < data.size(); i++) {
JSONObject movie = data.getJSONObject(i);
movies.add(史连永movie.getString("url"));
}
}
response.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
return movies;
}
}
/**
* 收集豆瓣电影线程
*/
class CrawlMovieThread extends Thread {
// 待收集链接
String url;
pu哈尔滨杀人犯赵志blic CrawlMovieThread(String url) {
this.url = url;
}
public void run() {
try {
Connection connection = Jsoup.connect(url)
.method(Connection.Method.GET)
.timeout(50000);
Connection.Response Response = connection.execute();
System.out.println("收集豆瓣电影,回来状况码:" + Response.statusCode());
} catch (Exception e) {
System.out.println("收集豆瓣电影,收集出反常:" + e.膀胱,倒车入库视频-ope足彩_ope体育投注_ope体育在线投注getMessage());
}
}
}

这段程序的逻辑比较简略,先收集到豆瓣抢手电影,这儿运用直接拜访 Ajax 获取豆瓣抢手电影的链接,然后解分出电影的详情页链接,多线程拜访详情页链接,由于只要在多线程的情况下才干到达豆瓣的拜访要求。豆瓣抢手电影页面如下:

屡次运转上面的程序,你最终会得到下图的成果

从上图中咱们能够看出,httpclient 拜访回来的状况码为 403 ,阐明咱们现已没有权限拜访该页面了,也风流僵尸的都市生活便是说豆瓣网现已以为咱们是爬虫程序啦,拒接掉了咱们的拜访恳求。咱们来剖析一下咱们现在的拜访架构,由于咱们是直接拜访豆瓣网的,所以此刻的拜访架构如下图所示:

咱们想要打破这层约束的话,咱们就不能直接拜访豆瓣网的服务器,咱们需求拉入第三方,让他人替代咱们去拜访,咱们每次拜访都找不同的人,这样就不会被约束了,这个也便是所谓的 IP署理。 此刻的拜访架构就变成了下面这张图:

咱们运用的 IP署理,咱们就需求有 IP署理池,接下来咱们就来聊一聊 IP 署理池

IP 署理池

署理服务器有许多厂商在做这一块,详细的我就不说了,自己百度 IP 署理能够搜出一大堆,这些 IP署理商都有供给收费和免费的署理 IP,收费的署理 IP可用性高,速度快,在线上环境假如需求运用署理的话,主张运用收费的署理 IP。假如仅仅自己研讨的话,咱们就能够去收集这些厂商的免费揭露署理 IP,这些 IP 的功能和可用性都比较差,可是不影响咱们运用。

由于咱们是 Demo 项目,所以咱们就自己建立 IP署理池。咱们该怎样规划一个 IP署理池呢?下图是我画的简略 IP高品彪署理池架构图

从上面的架构图中,能够看出一个 IP 署理体系会涉及到 4 个模块,分别为 IP 收集模块、 IP 存储模块、IP 检测模块和 API 接口模块。

  • IP 收集模块

担任从各大 IP署理厂商收集署理 IP,收集的网站越多,署理 IP 的可用性就越高

  • IP 存储模块

存储收集回来的署理 IP,比较常用的是 Redis 这样的高功能的数据库,在存储方面咱们需求存储两种数据,一种是检测可用的署理 IP,另一种是收集回来还未检测的署理 IP。

  • IP 检测模块

检测收集回来的 IP 是否可用,这样能够让咱们供给的 IP 可用性变高,咱们先过滤掉不可用的 IP。

  • API 接口敖德萨的勋绩模块

以接口的方式对外供给可用署理 IP

上面便是关于 IP署理池的相关规划,关于这些咱们只需求简略了解一下就行了,由于现在基本上不需求咱们去编写 IP署理池服务啦,在 GitHub 上现已有许多优异的开源项目,没必要重复造轮子啦。我为咱们选取了在 GitHub 上有 8K star 的开源 IP署理池项目 proxy_pool ,咱们将运用它作为咱们 IP 署理池。关于 proxy_pool 请拜访:https://github.com/jhao104/proxy_pool

布置 proxy_pool

proxy_pool 是用 python 言语写的,不过这也没什么联系,由于现在都能够容器化布置,运用容器化布置能够屏蔽掉一些环境的装置,只需求运转镜像就能够运转服务了,并不需求知道它里边的详细完成,所以这个项目不明白 Python 的 Java 程序员也是能够运用的。proxy_pool 运用的是 Redis 来存储收集的 IP,所以在发动 proxy_pool 前,你需求先发动 Redis 服务。下面是 proxy_pool docker发动过程。agnoy

  • 拉取镜像

docker pull jhao104/proxy_pool

  • 运转镜像

docker run --env db_type=REDIS --env db_host=127.0.0.1 --env db_port=6379 --env db_password湛风涛=pwd_str -p 5010:5010 jhao104/proxy_pool

  • 运转镜像后,咱们等候一段时间,由于第一次发动收集数据和处理数据需求一段时间。等候之后拜访 http://{your_host}:5010/get_all/,假如你得到下图所示的成果,阐明 proxy_pool 项目你现已布置成功。


运用 IP 署理

建立好 IP署理池之后,咱们就能够运用署理 IP 来收集豆瓣电影啦,咱们现已知道了除了 IP 之外,User Agent 恳求头也会是豆瓣网判别拜访是否是爬虫程序的一个要素,所以咱们也对 User Agent 恳求头进行假造,咱们每次拜访运用不同的 User Agent 恳求头。

咱们为豆瓣电影收集程序引进 IP署理和 随机 User Agent 恳求头,详细代码如下:

public class CrawlerMovieProxy {
/**
* 常用 user agent 列表
*/
static List USER_AGENT = new ArrayList(10) {
{
add("Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19");
add("Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Ve单纯蓝优惠码rsion/4.0 Mobile Safari/534.30");
add("Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P10大泽光00 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1");
add("Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0");
add("Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0");
add("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36");
add("Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19");
add("Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) Apple韩智秀WebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3");
add("Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3");
}
};
/**
* 随机获取 user agent
*
* @return
*/
public String randomUserAgent() {
Random random = new Random();
int num = random.nextInt(USER_AGENT.size());
return U膀胱,倒车入库视频-ope足彩_ope体育投注_ope体育在线投注SER_AGENT.get(num);
}
/**
* 设置署理ip池
*
* @param queue 行列
* @throws IOException
*/
public void proxyIpPool(LinkedBlockingQueue queue) throws IOException {
// 每次能随机获取一个署理ip
String proxyUrl = "http://192.168.99.100:5010/get_all/";
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(proxyUrl);
CloseableHttpResponse resp风暴兵王onse = httpclient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity, "utf-8");
JSONArray jsonArray = JSON.parseArray(body);
int size = Math.min(100, jsonArray.size());
for (int i = 0; i < size; i++) {
// 将恳求成果格局化成json
JSONObject data = jsonArray.getJSONObject(i);
String proxy = data.getString("proxy");
queue.add(proxy);
}
}
response.close();
httpclient.close();
return;
}
/**
* 随机获取一个署理ip
*
* @return
* @throws IOException
*/
public String randomProxyIp() throws IOException {
// 每次能随机获取一个署理ip
String proxyUrl = "http://192.168.99.100:5010/get/";
String proxy = "";
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new 膀胱,倒车入库视频-ope足彩_ope体育投注_ope体育在线投注HttpGet(proxyUrl);
CloseableHttpResponse response = httpclient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity, "utf-8");
// 将恳求成果格局化成json
JSONObject data = JSON.parseObject(body天辉发卡);
proxy = data.getString("proxy");
}
return proxy;
}
/**
* 豆瓣电影链接列表
*
* @return
*/
public List movieList(LinkedBlockingQueue queue) {
// 获取60条电影链接
String url = "膀胱,倒车入库视频-ope足彩_ope体育投注_ope体育在线投注https://movie.douban.com/j/search_subjects?type=movie&tag=抢手&sort=recomm膀胱,倒车入库视频-ope足彩_ope体育投注_ope体育在线投注end&page_limit=40&page_start=0";膀胱,倒车入库视频-ope足彩_ope体育投注_ope体育在线投注
List movies = new ArrayList<>(40);
try {
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
// 设置 ip 署理
HttpHost proxy = null;
// 随机获取一个署理IP
String proxy_ip = ran阑鬼坊domProxyIp();
if (StringUtils.isNotBlank(proxy_ip)) {
String[] proxyList = proxy_ip.split(":");
System.out.println(proxyList[0]);
proxy = new HttpHost(proxyList[0], Integer.parseInt(prox张钰淼yList[1]));
}
// 随机获取一个恳求头
httpGet.setHeader("User-Agent", randomUserAgent());
RequestConfig requestConfig = RequestConfig.custom()
.setProxy(proxy)
.setConnectTimeout(10000)
.setSocketTimeout(10000)
.setConnectionRequestTimeout(3000)
.build();
httpGet.setConfig(requestConfig);
CloseableHttpResponse response = client.execute(httpGet);
System.out.println("获取豆瓣电影列表,回来验证码:" + response.getStatusLine().getStatusCode());
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity, "utf-8");
// 将恳求成果格局化成json
JSONObject jsonObject = JSON.parseObject(body);
JSONArray data = jsonObject.getJSONArray("subjects");
for (int i = 0; i < data.size(); i++) {
JSONObject movie = data.getJSONObject(i);
movies.add(movie.getString("url"));
}
}
response.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
}
return movies;
}
public static void main(String[] args) {
// 寄存署理ip的行列
LinkedBlockingQueue周思盈 queue = new LinkedBlockingQueue(100);
try {
CrawlerMovieProxy crawlerProxy = new Cra火影之隙月流光wlerMovieProxy();
// 初始化ip署理行列
crawlerProxy.proxyIpPool(queue);
// 获取豆瓣电影列表
List movies = crawlerProxy.movieList(queue);
//创立固定巨细的线程池
ExecutorService exec = Executors.newFixedThreadPool(5);
for (String url : movies) {
//履行线程
exec.execute(new CrawlMovieProxyThread(url, queue, crawlerProxy));
}
//线程封闭
exec.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 收集豆瓣电影线程
*/
class CrawlMovieProxyThread extends Thread {
// 待收集链接
String url;
// 署理ip行列
LinkedBlockingQueue queue;
// 署理类
CrawlerMovieProxy crawlerProxy;
public CrawlMovieProxyThread(String url, LinkedBlockingQueue queue, CrawlerMovieProxy crawlerProxy) {
this.url = url;
this.queue = queue;
this.crawlerProxy = crawlerProxy;
}
public void run() {
String proxy;
String[] proxys = new String[2];
try {
Connection connection = Jsoup.connect(url)
.method(Connection.Method.GET)
.timeout(50000);
// 假如署理ip行列为空,则从头获取ip署理
if (queue.size() == 0) crawlerProxy.proxyIpPool(queue);
// 从行列中获取署理ip
proxy = queue.poll();
// 解析署理ip
proxys = proxy.split(":");
// 设置署理ip
connection.proxy(proxys[0], Integer.parseInt(proxys[1]));
// 设置 user agent
connection.header("User-Agent", crawlerProxy.randomUserAgent());
Connection.Response Response = connection.execute();
System.out.println("收集豆瓣电影,回来状况码:" + Response.statusCode() + " ,恳求ip:" + proxys[0]);
} catch (Exception e) {
System.out.println("收集豆瓣电影,收集出反常:" + e.getMessage() + " ,恳求ip:" + proxys[0]);
}
}
}

运转修改后的收集程序,或许需求屡次运转,由于你的署理 IP 不必定每次都有用。署理 IP 有用的话,你将得到如下成果

成果中咱们能够看出,40 次的电影详情页拜访,有许多的署理 IP 是无效的,只要一小部分的署理 IP 有用。成果直接证明了免费的署理 IP 可用性不高,所以假如线上需求运用署理 IP 的话,最好运用收费的署理 IP。虽然咱们自己建立的 IP署理池可用性不是太高,可是咱们设置的 IP 署理拜访豆瓣电影现已成功了,运用 IP 署理成功绕过了豆瓣网的约束。

关于爬虫服务器被屏蔽,原因有许多,咱们这篇文章首要介绍的是经过 设置 IP 署理和假造 User Ag膀胱,倒车入库视频-ope足彩_ope体育投注_ope体育在线投注ent 恳求头来绕过豆瓣网的拜访约束。怎么让咱们的程序不被资源网站视为爬虫程序呢?需求做好以下三点:

  • 假造 User Agent 恳求头
  • 运用 IP 署理
  • 不固定的收集间隔时间

相关新闻

admin

admin

TA太懒了...暂时没有任何简介

精彩新闻