空对象引用上的'java.lang.String org.jsoup.nodes.Element.text()'

时间:2019-02-16 18:37:10

标签: java web-scraping nullpointerexception

我一直在尝试使用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 :(得分:2)

您所做的应该很好。 我已经运行了一次,但是后来它停止工作了。

问题是,网站具有防刮擦机制,如果您在其网站上进行过多请求,则会阻止您访问。

我建议您做的是:

  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"> 

如果您还稍微搜索html中找到的distilIdentificationBlock,就会发现它与刮板被阻止有关。

希望它可以帮助您更好地了解正在发生的事情。