首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSoup HttpStatusException

JSoup HttpStatusException
EN

Stack Overflow用户
提问于 2016-11-22 20:17:26
回答 2查看 3.6K关注 0票数 1

我试图使用JSoup解析以下URL的html:

代码语言:javascript
复制
http://brickseek.com/walmart-inventory-checker/

当我执行程序时,我得到的是异常。我使用的是jsout-1.10.1.jar

代码语言:javascript
复制
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)

以下是该项目:

代码语言:javascript
复制
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");



    }
}

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-01 21:06:50

服务器可能有某种方法来检测您是否正在使用bot来抓取页面。尝试将您的http头更改为如下所示:

代码语言:javascript
复制
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复制的--通常,机器人是通过不同的标题顺序或标题的不同大写来检测到的。通过准确地复制Google,您应该能够绕过它而不被发现。

一些bot检测算法计算每个IP的请求数量,并开始阻塞超过某个阈值--这就是为什么它仍然对某些人有效。

票数 4
EN

Stack Overflow用户

发布于 2017-07-24 11:15:39

只需在代码中添加ignoreHttpErrors(true)即可。

代码语言:javascript
复制
   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();

谢谢

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40750860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档