我正在开发我的第一个简单项目,它是一个网络爬虫。但我试图抓取的页面不是一个简单的静态 HTML 页面,而是在我检查页面时有一堆 Get/Post 请求。
所以我目前正在努力使用 HtmlUnit 和 Java 重现这些请求。
我正在尝试使用 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;
}
所以我尝试将所有标题和正文设置为相同。但是当我运行这段代码时,我得到:
我对网络/浏览器的工作原理几乎一无所知,所以我现在很困惑。
我不知道我的整个概念是错误的还是这只是我的代码。
如果我必须找到另一种方法来做到这一点,那会是什么?
最佳答案
现在的网页或多或少都是这样的——在后台做了一堆魔法(主要基于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/