Java使用线程

时间:2017-09-15 10:44:47

标签: java multithreading web-scraping ip-address

目前我正在使用多个线程(URL连接方法)仅使用单个IP地址抓取多个网站,并被某些网站阻止。

我们希望以某种方式防止这个问题。这让我想到了我们的虚拟机有多个IP地址。

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

我尝试使用代理,但似乎无法正常工作,因为我认为本地IP不应该被代理。

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

Define source ip address using Apache HttpClient的另一个解决方案不起作用,因为函数已弃用。

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

2 个答案:

答案 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攻击,显然不友好。您最好的选择是联系网站所有者并征得许可。鉴于交通需要花钱,他们会非常想知道它们中的内容。