2016-11-22 3 views
1

Я пытаюсь разобрать HTML следующий URL с помощью JSoup:JSoup HttpStatusException

http://brickseek.com/walmart-inventory-checker/ 

Когда я выполнить программу я получаю ниже исключения. Я использую jsoup-1.10.1.jar

Exception in thread "main" org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403, URL=http://brickseek.com/walmart-inventory-checker/ 
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:598) 
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:548) 
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:235) 
    at Third.main(Third.java:22) 

Ниже программа:

import java.io.IOException; 

import org.jsoup.Connection.Method; 
import org.jsoup.Connection.Response; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

public class Third { 

    public static void main(String[] args) throws IOException { 

     String uniqueSku ="44656182"; 
     String zipCode ="75160"; 

     Response response = Jsoup.connect("http://brickseek.com/walmart-inventory-checker/") 
       .data("store_type","3", "sku", uniqueSku , "zip" , String.valueOf(zipCode) , "sort" , "distance") 
       .userAgent("Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2") 
       .method(Method.POST) 
       .timeout(0) 
       .execute(); 

       String rawHTML = response.body(); 
       Document parsedDocument = Jsoup.parse(rawHTML); 
       Element bodyElement = parsedDocument.body(); 
       Elements inStockTableElement = bodyElement.getElementsByTag("table"); 



    } 
} 

Любая помощь будет принята с благодарностью.

+0

Это работает для меня. : O –

+0

Он работает? Тем не менее, я получаю ту же проблему. Не могли бы вы рассказать мне, в каком редакторе (Ex Eclipse) вы используете? Версия Java и версия Jsoup? Я не знаю, как решить эту проблему :(Вы можете sysout для объекта inStockTableElement? – Radi

+0

Я использую Eclipse Luna, JDK 1.7.0_67, Jsoup 1.10.1. Да, я могу напечатать 'inStockTableElement' с помощью 'System.out.println()' и он печатает '

'. –

ответ

2

У сервера, вероятно, есть своего рода метод для определения того, используете ли вы бот для очистки страницы. Попробуйте изменить заголовок HTTP, чтобы что-то вроде этого:

public class Util { 
    public static Connection mask(Connection c) { 
     return c.header("Host", "brickseek.com") 
       .header("Connection", "keep-alive") 
//    .header("Content-Length", ""+c.request().requestBody().length()) 
       .header("Cache-Control", "max-age=0") 
       .header("Origin", "https://brickseek.com/") 
       .header("Upgrade-Insecure-Requests", "1") 
       .header("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.48 Safari/537.36") 
       .header("Content-Type", "application/x-www-form-urlencoded") 
       .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") 
       .referrer("http://brickseek.com/walmart-inventory-checker/") 
       .header("Accept-Encoding", "gzip, deflate, br") 
       .header("Accept-Language", "en-US,en;q=0.8"); 
    } 
} 

Этого заголовок был скопирован именно из заголовков Google Chrome - как правило, боты, обнаруженных в другом порядке заголовков или разная капитализация заголовков. Скопировав Google Chrome точно, вы должны быть в состоянии обойти его незамеченным.

Некоторые алгоритмы обнаружения ботов подсчитывают количество запросов на каждый IP-адрес и начинают блокировку выше определенного порога - поэтому он по-прежнему работает для некоторых людей.

2

Просто добавьте ignoreHttpErrors (true) в свой код.

Response response = Jsoup.connect("http://brickseek.com/walmart-inventory-checker/") 
       .data("store_type","3", "sku", uniqueSku , "zip" , String.valueOf(zipCode) , "sort" , "distance") 
       .userAgent("Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2") 
       .method(Method.POST) 
       .timeout(0).ignoreHttpErrors(true) 
       .execute(); 

Благодаря

Смежные вопросы