Java 利用多个 IP 使用线程进行网络抓取
Java utilize multiple IP for web crawl using threads
目前我正在使用多个线程(URL 连接方法)抓取多个网站,只有一个 IP 地址并被一些网站阻止。
我们想以某种方式防止这个问题。这让我想起了我们有多个 IP 地址的虚拟机。
我想问一下 Java 中是否有办法在不同的 URL 连接中使用这些本地 IP,而 运行 在不同的 java 线程下?
我试过使用代理,但它似乎不起作用,因为我认为不应代理本地 IP。
这是我尝试过的:
代理 proxy = new Proxy(Proxy.Type.HTTP, new
InetSocketAddress(InetAddress.getByAddress(ip), 8080));
的另一个解决方案不起作用,因为函数已折旧。
如果有人遇到相同的情况,非常感谢您的知识。
你不会走得太远。 IP 地址都必须在您的域内有效,否则您的计算机和 Web 服务器之间的路由将无法正常工作。
因此,流量将被识别为来自一个域。如果你在 IPv4 NATS 后面,你的所有流量都将看起来来自一个单一的 IP 地址,从而取消你正在尝试做的事情。如果你是 运行 IPv6,它看起来仍然像是所有流量都来自同一个地方。您无法做任何事情来让流量看起来像是来自不同的域并成功建立连接。 TCP 数据包必须成功路由,如果 return 地址不在您的域中,则不会发生这种情况。
有些网站阻止了您的请求,这不足为奇 - 来自一个地方的太多连接尝试看起来有点像 DOS 攻击,明显不友好。您最好的选择是联系网站所有者并请求许可。鉴于流量是要花钱的,他们很想知道流量对他们有什么好处。
使用最新的 HttpClient 的 RequestConfig 找到了解决方案,这是我的代码:
String ipAddress = "xxx.xxx.xxx.xxx"; // your intend source IP
byte ip[] = InetAddress.getByName(ipAddress).getAddress();
RequestConfig config = RequestConfig.custom()
.setLocalAddress(InetAddress.getByAddress(ip))
.build();
HttpClient client = HttpClientBuilder.create().build();
HttpGet getResquest = new HttpGet(address);
getResquest.setConfig(config);
HttpResponse response = client.execute(getResquest);
以防遇到同样问题的人。
很多Whosebug的回答都是用了之前的HttpClient with getParem方法,现在已经去复用了,现在应该用RequestConfig来修改。
目前我正在使用多个线程(URL 连接方法)抓取多个网站,只有一个 IP 地址并被一些网站阻止。
我们想以某种方式防止这个问题。这让我想起了我们有多个 IP 地址的虚拟机。
我想问一下 Java 中是否有办法在不同的 URL 连接中使用这些本地 IP,而 运行 在不同的 java 线程下?
我试过使用代理,但它似乎不起作用,因为我认为不应代理本地 IP。
这是我尝试过的: 代理 proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(InetAddress.getByAddress(ip), 8080));
的另一个解决方案不起作用,因为函数已折旧。
如果有人遇到相同的情况,非常感谢您的知识。
你不会走得太远。 IP 地址都必须在您的域内有效,否则您的计算机和 Web 服务器之间的路由将无法正常工作。
因此,流量将被识别为来自一个域。如果你在 IPv4 NATS 后面,你的所有流量都将看起来来自一个单一的 IP 地址,从而取消你正在尝试做的事情。如果你是 运行 IPv6,它看起来仍然像是所有流量都来自同一个地方。您无法做任何事情来让流量看起来像是来自不同的域并成功建立连接。 TCP 数据包必须成功路由,如果 return 地址不在您的域中,则不会发生这种情况。
有些网站阻止了您的请求,这不足为奇 - 来自一个地方的太多连接尝试看起来有点像 DOS 攻击,明显不友好。您最好的选择是联系网站所有者并请求许可。鉴于流量是要花钱的,他们很想知道流量对他们有什么好处。
使用最新的 HttpClient 的 RequestConfig 找到了解决方案,这是我的代码:
String ipAddress = "xxx.xxx.xxx.xxx"; // your intend source IP
byte ip[] = InetAddress.getByName(ipAddress).getAddress();
RequestConfig config = RequestConfig.custom()
.setLocalAddress(InetAddress.getByAddress(ip))
.build();
HttpClient client = HttpClientBuilder.create().build();
HttpGet getResquest = new HttpGet(address);
getResquest.setConfig(config);
HttpResponse response = client.execute(getResquest);
以防遇到同样问题的人。
很多Whosebug的回答都是用了之前的HttpClient with getParem方法,现在已经去复用了,现在应该用RequestConfig来修改。