2012-12-02 13 views
37

मैं किसी दिए गए Google खोज शब्द के परिणामों की मात्रा प्राप्त करने के लिए एक छोटा जावा प्रोग्राम लिख रहा हूं। किसी कारण से, जावा में मुझे 403 निषिद्ध मिल रहा है लेकिन मुझे वेब ब्राउज़र में सही परिणाम मिल रहे हैं। कोड:403 जावा के साथ निषिद्ध लेकिन वेब ब्राउजर नहीं?

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URL; 


public class DataGetter { 

    public static void main(String[] args) throws IOException { 
     getResultAmount("test"); 
    } 

    private static int getResultAmount(String query) throws IOException { 
     BufferedReader r = new BufferedReader(new InputStreamReader(new URL("https://www.google.com/search?q=" + query).openConnection() 
       .getInputStream())); 
     String line; 
     String src = ""; 
     while ((line = r.readLine()) != null) { 
      src += line; 
     } 
     System.out.println(src); 
     return 1; 
    } 

} 

और त्रुटि:

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: https://www.google.com/search?q=test 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source) 
    at DataGetter.getResultAmount(DataGetter.java:15) 
    at DataGetter.main(DataGetter.java:10) 

यह ऐसा क्यों कर रहा है?

+0

सत्रों के साथ कुछ करने के लिए हो सकता है? – kishu27

+0

आप एसएसएल एंडपॉइंट का उपयोग क्यों कर रहे हैं? – Perception

+0

@ धारणा उम ... एसएसएल एंडपॉइंट क्या है? (क्षमा करें, मैं इस तरह की चीजों के बारे में अनजान हूं) – Doorknob

उत्तर

68

तुम सिर्फ यह काम करने के लिए के लिए उपयोगकर्ता एजेंट शीर्ष लेख निर्धारित करने की आवश्यकता:

URLConnection connection = new URL("https://www.google.com/search?q=" + query).openConnection(); 
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); 
connection.connect(); 

BufferedReader r = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8"))); 

StringBuilder sb = new StringBuilder(); 
String line; 
while ((line = r.readLine()) != null) { 
    sb.append(line); 
} 
System.out.println(sb.toString()); 

एसएसएल पारदर्शी रूप से के रूप में अपने अपवाद स्टैकट्रेस से देखा जा सकता है आप के लिए नियंत्रित किया गया था।

परिणाम प्राप्त करना वास्तव में यह आसान नहीं है, इसके बाद आपको नकली होना है कि आप कुकी लाने और रीडायरेक्ट टोकन लिंक को पार्स करके ब्राउज़र हैं।

String cookie = connection.getHeaderField("Set-Cookie").split(";")[0]; 
Pattern pattern = Pattern.compile("content=\\\"0;url=(.*?)\\\""); 
Matcher m = pattern.matcher(response); 
if(m.find()) { 
    String url = m.group(1); 
    connection = new URL(url).openConnection(); 
    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); 
    connection.setRequestProperty("Cookie", cookie); 
    connection.connect(); 
    r = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8"))); 
    sb = new StringBuilder(); 
    while ((line = r.readLine()) != null) { 
     sb.append(line); 
    } 
    response = sb.toString(); 
    pattern = Pattern.compile("<div id=\"resultStats\">About ([0-9,]+) results</div>"); 
    m = pattern.matcher(response); 
    if(m.find()) { 
     long amount = Long.parseLong(m.group(1).replaceAll(",", "")); 
     return amount; 
    } 

} 

the full code चल रहा है मैं एक परिणाम के रूप 2930000000L मिलता है।

+0

दोस्त, मैं आपको बियर का एक टुकड़ा देना चाहता हूं, यह मेरी समस्या का एक आदर्श समाधान है! क्या Google इस विधि का उपयोग करके अपने परिणामों को प्रतिबंधित/थ्रॉटल कर सकता है? – gudthing

+0

@ गुडिंग थ्रॉटलिंग आईपी-आधारित है, इसलिए यह विधि के बारे में नहीं है लेकिन क्या आप अपना आईपी बदलते हैं :-) – Esailija

+0

मैं देखता हूं! एक साधारण राउटर पुनरारंभ (WAN परिवर्तन के लिए) समस्या हल करेगा :)। एक बार फिर धन्यवाद!! – gudthing

1

आप शायद सही शीर्षलेख स्थापित नहीं कर रहे हैं। यह देखने के लिए ब्राउज़र में LiveHttpHeaders (या समतुल्य) का उपयोग करें कि ब्राउजर कौन से शीर्षलेख भेज रहा है, फिर उन्हें अपने कोड में अनुकरण करें।

+0

मैंने 'https://www.google.com/search?q=" + query + "और rlz = 1C1RNNN_enUS371 और aq = f & oq =" + query + "और sugexp = क्रोम, mod = 6 और sourceid = क्रोम और यानी = यूटीएफ -8" ' , अभी भी काम नहीं किया – Doorknob

+0

@ पिक्लिश डोरोकनोब आपने एक क्वेरी स्ट्रिंग पैरामीटर जोड़ा, आपने हेडर को नहीं बदला। आप 'URLConnection' ऑब्जेक्ट – Esailija

+0

पर '.setRequestProperty()' के साथ हेडर सेट कर सकते हैं। यहां एक ऐसा लेख है जो अनुरोध शीर्षलेख जोड़ने के बारे में बात करता है: http://stackoverflow.com/questions/480153/how-to-modify-the-header -of-a-fanspurlconnection –

0

ऐसा इसलिए है क्योंकि साइट SSL का उपयोग करती है। जर्सी HTTP क्लाइंट का उपयोग करने का प्रयास करें। आपको शायद HTTPS और प्रमाणपत्रों के बारे में कुछ भी सीखना होगा, लेकिन मुझे लगता है कि जर्सी वास्तविक सुरक्षा से संबंधित अधिकांश विवरणों को अनदेखा करने के लिए सेट कर सकता है।

+1

नहीं, यह नहीं है, यह सिर्फ ब्राउज़र के हेडर्स जैसे @ केविनडे ने अपने जवाब में कहा है। – Esailija

+2

@ बेन ब्रंक - यहां एक अच्छा सबक है - मूल पर, सभी प्रोग्रामिंग अतिरिक्त अमूर्तता की परत पर परत से बना है। निम्न स्तर को समझना बहुत उपयोगी है। आपके जैसा वर्णन करने वाले उच्च स्तरीय क्लाइंट का उपयोग करना काम कर सकता है - लेकिन केवल इसलिए कि यह निम्न स्तर की कॉल कर रहा है जिसे आप चुन सकते हैं यदि आप चुनते हैं। मैं कभी नहीं भूलूंगा कि मेरे लिए बैठना और टेलनेट क्लाइंट का उपयोग करके वेब सर्वर से बातचीत करना और हाथ से HTTP अनुरोध तैयार करना कितना रोचक था। राम-राम! –

+0

दरअसल, मुझे अभी भी यकीन नहीं है कि वह कोड क्यों काम करता है क्योंकि आपको सामान्य रूप से यूआरएल कनेक्शन के साथ एसएसएल का उपयोग करने के लिए अपने स्थानीय जावा कीस्टोर में साइट का सार्वजनिक प्रमाणपत्र जोड़ना होगा, इसलिए कुछ यूआरएल के बारे में कुछ नहीं जोड़ा जाता है । साथ ही, आपको क्या लगता है कि मैंने टेलनेट का उपयोग कर किसी वेबसाइट से कभी कनेक्ट नहीं किया है? मैं यह एक जीवित रहने के लिए करता हूं और मैं अक्सर भूल जाता हूं कि इस साइट पर बहुत से लोग हैं जो छात्र या शौक प्रोग्रामर हैं। मैं बस हंसमुख होने की कोशिश करता हूँ। –

संबंधित मुद्दे