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