एक जावा URLConnection के उपयोगकर्ता एजेंट की स्थापना


80

मैं URL के साथ URL का उपयोग करके वेबपेज को पार्स करने की कोशिश कर रहा हूं। मैं इस तरह उपयोगकर्ता-एजेंट स्थापित करने का प्रयास करता हूं:

java.net.URLConnection c = url.openConnection();
c.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");

लेकिन परिणामी उपयोगकर्ता एजेंट वह है जिसे मैं निर्दिष्ट करता हूं, "जावा / 1.5.0_19" अंत तक संलग्न है। क्या इस तरीके के बिना उपयोगकर्ता एजेंट को सही मायने में सेट करने का एक तरीका है?


आप कैसे जानते हैं कि परिणामी उपयोगकर्ता-एजेंट है? आप इसे कहां देख रहे हैं?
स्केफ़मैन

1
इसे PHP के साथ लाकर और जावा द्वारा पकड़े जा रहे पृष्ठ पर प्रदर्शित करके।
DiglettPotato

यह वास्तव में अब काम करता है, दूसरा जवाब देखें।
रोजरपैक 15

जवाबों:


71

हाथ से, http.agentसिस्टम प्रॉपर्टी सेट करने से ""हो सकता है कि ट्रिक (मेरे सामने कोड न हो)।

आप के साथ दूर हो सकता है:

 System.setProperty("http.agent", "");

लेकिन यह आपके और URL प्रोटोकॉल हैंडलर के आरंभीकरण के बीच एक दौड़ की आवश्यकता हो सकती है, अगर यह स्टार्टअप पर मूल्य को कैश करता है (वास्तव में, मुझे नहीं लगता कि यह करता है)।

संपत्ति JNLP फ़ाइलों (6u10 से एप्लेट के लिए उपलब्ध) और कमांड लाइन पर भी सेट की जा सकती है:

-Dhttp.agent=

या आवरण आदेशों के लिए:

-J-Dhttp.agent=

मुझे यह कैसे करना है? c.setRequestProperty ("http.agent", "") ;; मैं कहीं और मान रहा हूं ...
DiglettPotato

1
हाँ ... वह काम एक आकर्षण की तरह! बस करें: System.setProperty ("http.agent", "Mozilla / 5.0 (Macintus; U; Intel / Mac OS X 10.4; en-US; rv: 1.9.2.2) Gecko / 20100316 Firefox / 3.6.2"); और आप जाने के लिए तैयार हैं !! :)
eduardo.lope

94

स्पष्टीकरण के लिए: setRequestProperty("User-Agent", "Mozilla ...")अब ठीक काम करता है और java/xxअंत में संलग्न नहीं होता है ! कम से कम जावा 1.6.30 और नए के साथ।

मैंने अपने मशीन पर netcat (एक पोर्ट श्रोता) के साथ सुना:

$ nc -l -p 8080

यह केवल पोर्ट पर सुनता है, इसलिए आप कुछ भी देखते हैं जो अनुरोधित हो जाता है, जैसे कच्चे http-headers।

और निम्नलिखित http-headers को बिना setRequestProperty मिला:

GET /foobar HTTP/1.1
User-Agent: Java/1.6.0_30
Host: localhost:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

और setRequestProperty के साथ:

GET /foobar HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2
Host: localhost:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

जैसा कि आप देख सकते हैं कि उपयोगकर्ता एजेंट ठीक से सेट किया गया था।

पूर्ण उदाहरण:

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;


public class TestUrlOpener {

    public static void main(String[] args) throws IOException {
        URL url = new URL("http://localhost:8080/foobar");
        URLConnection hc = url.openConnection();
        hc.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");

        System.out.println(hc.getContentType());
    }

}

2
खैर, अगर कोई अभी भी जावा 1.5 का उपयोग करता है
18

3
@Dejell क्या आप सुझाव दे रहे हैं कि यह दृष्टिकोण पुराना है? मैं जावा 7 का उपयोग कर रहा हूं और यह वही है जो मैं करना चाहता था।
शादिनिजा

5

मेरे लिए इसके काम ने AddRequestProperty में User-Agent को सेट किया।

URL url = new URL(<URL>);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.addRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0");

HttpURLConnection को कास्ट करने की आवश्यकता नहीं है।
jechterhoff

1
@jechterhoff यह जावा 8 में आवश्यक है
FonzTech

@FonzTech मैं नहीं देखता कि जावा 8 में कलाकारों की आवश्यकता क्यों होगी। मेरे कार्यक्रम में निम्नलिखित कार्य (अनुपालन जावा 1.8 है): URL clSourceUrl = नया URL (clSource); URLConnection urlConn = clSourceUrl.openConnection (); urlConn.setRequestProperty ("उपयोगकर्ता-एजेंट", "मोज़िला / 5.0 (विंडोज NT; Win64; x64; rv: 56.0) गेको / 20100101 फ़ायरफ़ॉक्स / 56.0"); क्या आप कृपया विस्तार से बता सकते हैं?
jechterhoff

@jechterhoff ने उत्तर देने वाले उपयोगकर्ता का उपयोग किया HttpURLConnection। अगर वह इस्तेमाल करता तो आप सही होते URLConnection। वैसे भी, यदि आप इस लाइन HttpURLConnection c = new URL("http://www.google.com").openConnection();को उदाहरण के लिए संकलित करने का प्रयास करते हैं, तो आपको उस लाइन पर javacदे देंगे error: incompatible types। मैं जावा 1.8.0 r172 का उपयोग कर रहा हूं, इसलिए जावा 8 की सबसे हालिया रिलीज
FonzTech

@FonzTech आह, अब मैं देख रहा हूं कि आपका क्या मतलब है। मुझे अपनी पहली टिप्पणी (उस बारे में खेद) में और अधिक सटीक होना चाहिए: मैं जो कहना चाहता था, वह यह है कि आपको यहाँ पर HttpURLConnection का उपयोग करने की आवश्यकता नहीं है। जाहिरा तौर पर आप केवल URLConnection का उपयोग कर सकते हैं, जैसा कि मेरी पिछली टिप्पणी में दिखाया गया है। मुझे लगा कि इससे जवाब में थोड़ा सुधार हो सकता है। किसी भी स्थिति में, आप सही हैं कि HttpURLConnection c = new URL("http://www.google.com").openConnection();निश्चित रूप से HttpURLConnection - जावा 8 और जावा के पिछले संस्करणों में भी एक कलाकार की आवश्यकता है।
जिटेरहॉफ

2

HTTP सर्वर पुराने ब्राउज़र और सिस्टम को अस्वीकार करते हैं।

पृष्ठ टेक ब्लॉग (व्हाट): अधिकांश आम उपयोगकर्ता एजेंट आपके वर्तमान ब्राउज़र के उपयोगकर्ता-एजेंट की संपत्ति "आपका उपयोगकर्ता एजेंट है:" को दर्शाता है , जिसे या तो अनुरोध की गई संपत्ति "उपयोगकर्ता-एजेंट" सेट करने के लिए लागू किया जा सकता है java.net.URLConnection। सिस्टम प्रॉपर्टी "http.agent"।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.