java - 运行代码时出现状态代码 405 错误

标签 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

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

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

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

最佳答案

现在的网页或多或少都是这样的——在后台做了一堆魔法(主要基于js)来让用户满意(至少页面设计者相信这一点)。

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

如果您想将 HtmlUnit 完成的请求与真实浏览器完成的请求进行比较,我建议使用 charles web proxy ( https://www.charlesproxy.com/ ) 等工具来单独捕获流量并进行比较。

如果您认为 HtmlUnit 与真实浏览器不一样,请在 Github 上提出问题。

关于java - 运行代码时出现状态代码 405 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59698035/

相关文章:

java - 如何在存在事务的情况下使代码可重用性成为可能?

python - 使用 scrapy 链接请求

java - 为什么 Selenium Webdriver 找不到某些 css 选择器?

javascript - 获取 xmlHTTP 请求不起作用

javascript - jQuery.ajax : TypeError: Property 'xhr' of object #<Object> is not a function

java - Spring cloud Netflix-Hystrix gradle 依赖项不允许启动 spring boot 应用程序

java - 等待线程结果返回方法的值(Web 应用程序)

python-3.x - 如何停止重定向并停留在页面上以抓取数据(python3、beautifulsoup、urllib)

xmlhttprequest - 服务人员 : Retrieve xhr body when fetching the request

java - 无法从终端编译访问 jar 文件