2017-09-15 123 views
1

目前我正在使用多个线程(URL连接方法)使用单个IP地址来爬取多个网站,并被某些网站拦截。Java利用多个IP进行网络抓取,使用线程

而我们想以某种方式防止这个问题。这导致我想到我们的虚拟机具有多个IP地址。

我想问一下,有没有在Java中使用这些本地IP在不同的Java线程下运行的不同URL连接?

我试过使用代理,但它似乎不工作,因为我相信本地IP不应该被代理。

这里是我的尝试: 代理代理=新代理(Proxy.Type.HTTP,新 的InetSocketAddress(InetAddress.getByAddress(IP),8080));

Define source ip address using Apache HttpClient的另一个解决方案不起作用,因为这些功能已折旧。

非常感谢您的知识,如果有人遇到相同的情况。

回答

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进行修改。

0

你不会走得很远。 IP地址必须在您的域中有效,否则您的计算机和Web服务器之间的路由将不起作用。

因此,流量将被识别为来自单个域。如果你在IPv4 NAT的后面,你的所有流量似乎都来自单一的IP地址,这就消除了你想要做的事情。如果你运行IPv6,它仍然会看起来像他所有的流量来自同一个地方。没有什么可以做,这将允许流量似乎来自不同的域名并成功建立连接。 TCP数据包必须成功路由,如果返回地址不在您的域中,则不会发生这种情况。

某些网站阻止了您的请求,这并不令人惊讶 - 来自一个地方的太多连接尝试看起来有点像DOS攻击,显然不友好。您最好的选择是联系网站所有者,并征得许可。考虑到流量花费金钱,他们将非常想知道对他们来说有什么。