Почему я могу получить только HTML для главной страницы веб-сайтов, а не для других? - PullRequest
1 голос
/ 10 октября 2009

Я пишу Java-программу, которая подключается к веб-сайту и возвращает HTML, по какой-то причине у меня проблемы с этим. Прямо сейчас я могу получить доступ к веб-сайту, только если я

 //example     String host = "www.google.com"

но если я хочу получить доступ к более сложному URL-адресу, я получаю исключение UnknownHostException. Сначала я подумал, что это может быть связано с тем, что он не распознает определенные символы в URL, но я не уверен. Например, вот один из URL-адресов, к которым я пытаюсь получить доступ.

host ="http://www.cyberspacei.com/englishwiz/library/name/etymology_of_first_names.htm";
int port = 80;
Socket s = new Socket(host,port)

.... и т.д.

и он не вернет ничего, кроме UnknownHostException.

Кто-нибудь, пожалуйста, помогите мне !!!

Ответы [ 4 ]

5 голосов
/ 10 октября 2009

это сбой, потому что вас спрашивают об имени хоста, а не об URL-адресе, подобном тому, который вы вводите; если вам нужен документ с этим URL-адресом, вам нужно использовать класс URL-адреса

URL url = new URL("http://www.thesite.com/thefile.html");
Object doc = url.getContent();

Конечно, вам нужно заменить «Object doc» файлом, подготовленным для кэширования этого содержимого.

4 голосов
/ 10 октября 2009

Параметр «host» для объекта Socket указывает, к какому компьютеру подключаться в сети (интернет). Это отличается от URI, используемого в веб-браузере, который включает протокол, сервер и структуру каталогов запрашиваемого файла или объекта.

Socket s = новый Socket ("www.cyberspacei.com", "80"); откроет новый необработанный сокет для веб-сервера, работающего на этом компьютере, но затем вы сможете договориться о протоколе HTTP через этот сокет и запросить "/englishwiz/library/name/etymology_of_first_names.htm"

Вы можете избавить себя от головной боли, используя библиотеку, такую ​​как HttpClient, которая берет на себя большую часть работы по согласованию http, если вам не нужен необработанный доступ к потоку http.

http://hc.apache.org/httpclient-3.x/index.html

2 голосов
/ 10 октября 2009

Я не эксперт в области Java, но я знаю, что пошло не так.

Во-первых, переменная хоста должна содержать только хост URL.

Хост URL http://www.cyberspacei.com/englishwiz/library/name/etymology_of_first_names.htm на самом деле 'cyberspacei.com'

Итак, вы подключаетесь к хосту, а затем отправляете заголовки HTTP для запроса страницы, которую вы ищете.

GET /englishwiz/library/name/etymology_of_first_names.htm HTTP/1.0
Host: cyberspacei.com
Accept: */*
Connection: Close

Для некоторых веб-страниц могут потребоваться заголовки User-Agent или Referer. поэтому добавьте поля соответствующим образом.

1 голос
/ 10 октября 2009

@ ONi прямо здесь. Вы используете класс Socket (), что означает, что вы используете необработанные сокеты и хотите писать свои собственные запросы HTTP / веб-сервера. Вы хотите что-то более похожее на класс URL, потому что этот класс «понимает» HTTP-запрос и просто предоставляет вам содержимое веб-сайта.

Это похоже на разницу между распечаткой и чтением электронной почты с вашего компьютера (класс URL) и засуныванием сетевого шнура в рот и попыткой расшифровать сигналы языком. Класс Socket () слишком низкоуровневый для того, что вы делаете.

...