运行代码时收到状态码405错误

时间:2020-01-11 19:43:00

标签: java web-scraping xmlhttprequest web-crawler htmlunit

我正在做我的第一个简单项目,它是一个网络爬虫。但是我要抓取的页面不是一个简单的静态HTML页面,而是在检查页面时出现一堆Get / Post请求。

所以我目前正在使用HtmlUnit和Java再现这些请求。

original request

我正在尝试使用HtmlUnit和Java模拟此POST请求。

    public Page getCategoryKeywordRank(int catID) throws Exception{

    initBrowser();

    WebRequest webRequest = new WebRequest(new URL("https://datalab.naver.com/shoppingInsight/sCategory.naver"), HttpMethod.POST);

    webRequest.setAdditionalHeader("authority", "datalab.naver.com");
    webRequest.setAdditionalHeader("method", "POST");
    webRequest.setAdditionalHeader("path", "/shoppingInsight/getCategoryKeywordRank.naver");
    webRequest.setAdditionalHeader("scheme", "https");
    webRequest.setAdditionalHeader("accept", "*/*");
    webRequest.setAdditionalHeader("accept-encoding", "gzip, deflate, br");
    webRequest.setAdditionalHeader("accept-language", "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7");
    webRequest.setAdditionalHeader("content-type", "application/x-www-form-urlencoded; charset=UTF-8");
    webRequest.setAdditionalHeader("origin", "https://datalab.naver.com");
    webRequest.setAdditionalHeader("referer", "https://datalab.naver.com/shoppingInsight/sCategory.naver");
    webRequest.setAdditionalHeader("sec-fetch-mode", "cors");
    webRequest.setAdditionalHeader("sec-fetch-site", "same-origin");
    webRequest.setAdditionalHeader("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36");
    webRequest.setAdditionalHeader("x-requested-with", "XMLHttpRequest");

    webRequest.setRequestBody("cid=" + catID +
            "&timeUnit=date" +
            "&startDate=2019-12-10" +
            "&endDate=2020-01-10" +
            "&age=" +
            "&gender=" +
            "&device=" +
            "&page=3" +
            "&count=20");

    Page page = browser.getPage(webRequest);

    return page;
}

因此,我尝试将所有标头和正文都设置为相同。但是,当我运行此代码时,我得到: error code

我对网络/浏览器的工作原理几乎一无所知,所以我现在很困惑。

我不知道我的整个概念是错误的还是仅仅是我的代码。

如果我必须找到另一种方法,那会是什么?

1 个答案:

答案 0 :(得分:0)

今天的网页或多或少都是这样-后台做了很多魔术(主要基于js),以使用户满意(至少页面设计者对此感到满意)。

HtmlUnit的想法是模拟一个完整的Web浏览器,但用api代替用户交互。通常,您不会自己创建所有请求内容。请参阅第http://htmlunit.sourceforge.net/gettingStarted.html页的前两个示例以了解想法。

如果您想将HtmlUnit的请求与真实浏览器的请求进行比较,我建议使用查尔斯Web代理(https://www.charlesproxy.com/)之类的工具分别捕获流量并进行比较。

如果您认为HtmlUnit与真实的浏览器不同,请在Github上发布一个问题。

相关问题