目前,我正在使用只有一个IP地址的多个线程(URL连接方法)抓取多个网站,并被某些网站阻止。
我们希望以某种方式防止这个问题。这让我想到了具有多个 IP 地址的虚拟机。
我想问一下,Java 中是否有办法在不同 Java 线程下运行的不同 URL 连接中利用这些本地 IP?
我尝试使用代理,但它似乎不起作用,因为我认为本地 IP 不应该被代理。
这是我尝试过的:代理代理=新代理(Proxy.Type.HTTP,新InetSocketAddress(InetAddress.getByAddress(ip),8080));
使用 Apache HttpClient 定义源 IP 地址的另一个解决方案不起作用,因为这些函数已折旧。
如果有人遇到相同的情况,非常感谢您的知识。
使用最新的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);
以防万一遇到相同问题的人。
来自stackoverflow的很多答案都使用了以前的HttpClient和getParem方法,现在它被剥夺了,现在应该使用RequestConfig进行修改。
你走不了多远。IP 地址都必须在您的域中有效,否则您的计算机和 Web 服务器之间的路由将无法正常工作。
因此,流量将可识别为来自一个域。如果您使用的是IPv4 NATS之后,则所有流量似乎都来自一个IP地址,从而撤消了您要执行的操作。如果您正在运行IPv6,则看起来所有流量仍然来自同一位置。您无法执行任何操作,以使流量看起来来自不同的域并成功建立连接。TCP 数据包必须成功路由,如果返回地址不在您的域中,则不会发生这种情况。
一些网站阻止了您的请求也就不足为奇了 - 从一个地方进行太多的连接尝试看起来有点像DOS攻击,显然不友好。您最好的选择是联系网站所有者并征求许可。鉴于交通要花钱,他们会非常正确地想知道这对他们有什么好处。