2017-09-15 121 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攻擊,顯然不友好。您最好的選擇是聯繫網站所有者,並徵得許可。考慮到流量花費金錢,他們將非常想知道對他們來說有什麼。