'java.lang.String org.jsoup.nodes.Element.text ()' для ссылки на пустой объект - PullRequest
0 голосов
/ 16 февраля 2019

Я пытался получить строку с веб-сайта с помощью Java.Вот мой код для этого:

protected String doInBackground(String... urls) {
    try {
        gotten_next_date = Jsoup.connect("https://www.vividseats.com/nba-basketball/toronto-raptors-schedule.html")
                    .get().getElementsByClass("productionsDate").first().text();
        full_next = gotten_next_date;

        return full_next;
    } catch (IOException e) {
        return "Unable to retrieve data. URL may be invalid.";
    }

Я написал это вчера, и оно работало отлично, но когда я попробовал это сегодня, он по какой-то причине дал мне эту ошибку:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.jsoup.nodes.Element.text()' on a null object reference

Я не понимаю, почему это происходит.Может кто-нибудь помочь?

РЕДАКТИРОВАТЬ: Я считаю, что ошибка не происходит из-за создания переменной, но из-за не получения элемента с веб-сайта.Я думаю, что этот вопрос ошибочно помечен как дубликат.

1 Ответ

0 голосов
/ 16 февраля 2019

То, что вы сделали, должно работать нормально.Я запустил его один раз, но потом он перестал работать.

Проблема в том, что на веб-сайте есть механизм защиты от соскабливания, который блокирует вас, если вы делаете слишком много запросов на их сайте.

Что яРекомендую вам сделать это:

  1. добавить userAgent(), чтобы идентифицировать себя как скребок бота.
  2. прочитайте их Условия предоставления услуг, чтобы проверить, разрешено ли вам просматривать их сайт,
  3. отправьте им электронное письмо с сообщением о своих намерениях и о том, что они в порядке и могут удалить части своего сайта.

Кстати, если вы хотите отладить то, что происходит, как яесли это просто изменить вызовы Jsoup следующим образом:

String gotten_next_date =
                Jsoup.connect("https://www.vividseats.com/nba-basketball/toronto-raptors-schedule.html").get().html();

Возвращает HTML-код запрошенной страницы, который, если вы посмотрите, не имеет ничего интересного.

<!doctype html>
<html>
 <head> 
  <meta NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"> 
  <meta http-equiv="cache-control" content="max-age=0"> 
  <meta http-equiv="cache-control" content="no-cache"> 
  <meta http-equiv="expires" content="0"> 
  <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT"> 
  <meta http-equiv="pragma" content="no-cache"> 
  <meta http-equiv="refresh" content="10; url=/distil_r_captcha.html?requestId=291c6193-eb12-4e96-b1cd-23ba9a75e659&amp;httpReferrer=%2Fnba-basketball%2Ftoronto-raptors-schedule.html"> 
  <script type="text/javascript">
    (function(window){
        try {
            if (typeof sessionStorage !== 'undefined'){
                sessionStorage.setItem('distil_referrer', document.referrer);
            }
        } catch (e){}
    })(window);
</script> 
  <script type="text/javascript" src="/vvdstsdstl.js" defer></script>
  <style type="text/css">#d__fFH{position:absolute;top:-5000px;left:-5000px}#d__fF{font-family:serif;font-size:200px;visibility:hidden}#twsyxyabbqdwrxzyzxesxywvwuzbszeeacwd{display:none!important}</style> 
  <script>var w=window;if(w.performance||w.mozPerformance||w.msPerformance||w.webkitPerformance){var d=document;AKSB=w.AKSB||{},AKSB.q=AKSB.q||[],AKSB.mark=AKSB.mark||function(e,_){AKSB.q.push(["mark",e,_||(new Date).getTime()])},AKSB.measure=AKSB.measure||function(e,_,t){AKSB.q.push(["measure",e,_,t||(new Date).getTime()])},AKSB.done=AKSB.done||function(e){AKSB.q.push(["done",e])},AKSB.mark("firstbyte",(new Date).getTime()),AKSB.prof={custid:"632139",ustr:"",originlat:"0",clientrtt:"124",ghostip:"72.247.179.76",ipv6:false,pct:"10",clientip:"79.119.120.57",requestid:"418cf776",region:"26128",protocol:"",blver:14,akM:"b",akN:"ae",akTT:"O",akTX:"1",akTI:"418cf776",ai:"275708",ra:"false",pmgn:"",pmgi:"",pmp:"",qc:""},function(e){var _=d.createElement("script");_.async="async",_.src=e;var t=d.getElementsByTagName("script"),t=t[t.length-1];t.parentNode.insertBefore(_,t)}(("https:"===d.location.protocol?"https:":"http:")+"//ds-aksb-a.akamaihd.net/aksb.min.js")}</script> 
 </head> 
 <body> 
  <div id="distilIdentificationBlock">
   &nbsp;
  </div>   
 </body>

Обновление:(из zack6849) Если вы внимательно посмотрите внутри тега head, последний тег meta намекает на то, что вы перенаправлены на страницу с картинкой:

<meta http-equiv="refresh" content="10; url=/distil_r_captcha.html?requestId=291c6193-eb12-4e96-b1cd-23ba9a75e659&amp;httpReferrer=%2Fnba-basketball%2Ftoronto-raptors-schedule.html"> 

Если вы также ищете немного для distilIdentificationBlock который находится в html, вы можете видеть, что это связано с блокировкой скребков.

Надеюсь, это поможет вам лучше понять, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...