Я создаю простое веб-приложение на Java Maven, которое представляет собой небольшую поисковую систему на основе веб-сайта Gamespot. Он использует Jsoup для обработки скребка.
Фрагмент моего файла сервлета ( Search.java ):
public ArrayList<Game> results = new ArrayList<Game>();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Search result that the user inputs
String s = request.getParameter("searchQuery").trim();
results.clear();
search(s);
//Parsed data will be passed from this servlet to search.jsp to be displayed
String json = new Gson().toJson(results);
response.setContentType("/application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(json);
}
protected void search(String query) {
if(query.contains(" ")) {
query.replaceAll(" ", "+");
if(query.endsWith("+")) {
query = query.substring(0, query.length() - 1);
}
}
try {
Document doc = Jsoup.connect("http://www.gamespot.com/search/?i=site&q=" + query.toLowerCase())
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36").get();
Elements div = doc.select("div.media-img.imgflare--boxart");
Elements images = div.select("img");
for(Element image : images) {
Game g = new Game();
g.setImage(image.attr("src"));
g.setName(image.attr("alt"));
results.add(g);
}
} catch (IOException e) {
e.printStackTrace();
}
}
При локальном запуске в Eclipse он работает отлично и не выдает никаких ошибок в консоли.
Но когда я внедряю этот код в Heroku, страница в основном выглядит пустой и не показывает результатов поиска.
Когда я открываю журнал, я вижу эту трассировку стека:
2019-06-15T00:07:16.508901+00:00 app[web.1]: org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403, URL=https://www.gamespot.com/search/?i=site&q=zelda
2019-06-15T00:07:16.508989+00:00 app[web.1]: at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:776)
2019-06-15T00:07:16.509047+00:00 app[web.1]: at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:773)
2019-06-15T00:07:16.509072+00:00 app[web.1]: at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:722)
2019-06-15T00:07:16.509094+00:00 app[web.1]: at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:306)
2019-06-15T00:07:16.509118+00:00 app[web.1]: at org.jsoup.helper.HttpConnection.get(HttpConnection.java:295)
2019-06-15T00:07:16.509146+00:00 app[web.1]: at com.GameSearchWebApp.Controller.Search.search(Search.java:94)
2019-06-15T00:07:16.509164+00:00 app[web.1]: at com.GameSearchWebApp.Controller.Search.doGet(Search.java:59)
2019-06-15T00:07:16.509200+00:00 app[web.1]: at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
2019-06-15T00:07:16.509221+00:00 app[web.1]: at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
2019-06-15T00:07:16.509241+00:00 app[web.1]: at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
2019-06-15T00:07:16.509264+00:00 app[web.1]: at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
2019-06-15T00:07:16.509289+00:00 app[web.1]: at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
2019-06-15T00:07:16.509337+00:00 app[web.1]: at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
2019-06-15T00:07:16.509356+00:00 app[web.1]: at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
2019-06-15T00:07:16.509377+00:00 app[web.1]: at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
2019-06-15T00:07:16.509399+00:00 app[web.1]: at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
2019-06-15T00:07:16.509420+00:00 app[web.1]: at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
2019-06-15T00:07:16.509442+00:00 app[web.1]: at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
2019-06-15T00:07:16.509477+00:00 app[web.1]: at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
2019-06-15T00:07:16.509495+00:00 app[web.1]: at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
2019-06-15T00:07:16.509517+00:00 app[web.1]: at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
2019-06-15T00:07:16.509539+00:00 app[web.1]: at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
2019-06-15T00:07:16.509566+00:00 app[web.1]: at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
2019-06-15T00:07:16.509590+00:00 app[web.1]: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
2019-06-15T00:07:16.509611+00:00 app[web.1]: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
2019-06-15T00:07:16.509632+00:00 app[web.1]: at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
2019-06-15T00:07:16.509654+00:00 app[web.1]: at java.lang.Thread.run(Thread.java:748)
Эта строка:
2019-06-15T00:07:16.509146+00:00 app[web.1]: at com.GameSearchWebApp.Controller.Search.search(Search.java:94)
ссылается на эту строку в моем коде:
Document doc = Jsoup.connect("http://www.gamespot.com/search/?i=site&q=" + query.toLowerCase())
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36").get();
Это проблема в Heroku, или мне нужно что-то добавить к этой строке кода, чтобы она работала правильно? Единственный ответ, который я видел, чтобы решить эту ошибку 403, - добавить User-Agent, но у меня это ясно есть.