对网站进行网络爬网将返回空(使用preg_match_all)

时间:2020-06-26 13:12:04

标签: php web-crawler

我正在尝试使用网络爬虫(以下代码)提取此page中列出的所有查询。但是好像我错过了什么。

我的代码如下:

<?php
    function getSslPage($url){
                    
       $ch = curl_init();      
       curl_setopt($ch, CURLOPT_URL, $url);
       curl_setopt($ch, CURLOPT_HEADER, 0);
       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
       curl_setopt($ch, CURLOPT_COOKIEJAR,   "cookie.txt");
       curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
       curl_setopt($ch, CURLOPT_USERAGENT, "Chrome/36.0.1985.125");
           $login = curl_exec($ch);
           return $login;
   }
                        
       $milesfeed  = getSslPage('http://www.usmleforum.com/forum/index.php?forum=1'); 
       preg_match_all('/<td class="FootNotes2">(.*?)<\/td>/s',$milesfeed,$links);
                        
       $milesfeed_links=[]; 
       $milesfeed_text=[]; 
                        
       $fourth="abc";
       $third="abc";
   //$third="https://onemileatatime";
       foreach($links[1] as $miles){
                            
       $milesfeed_text[] = strip_tags($miles);
       preg_match_all('/<a target="_top" class="Links2" href="(.*?)">/s', $miles, $link);
       $milesfeed_links[] = strip_tags($link[1][0]); 
       $first=explode("://",$link[1][0]);
       $second=explode(".",$first[1]);
       //print_r($second);
                            
       if($second[0]!=$third || $third=="abc"){
           if($second[0]=="www"){
                 echo "<h3>".ucfirst($second[1])."</h3>";
           }else{
                 echo "<h3>".ucfirst($second[0])."</h3>";
           }
       }
        echo '<a href="'.$link[1][0].'" target="_blank">'.wordwrap(strip_tags($miles),30).'</a><br><br>';
           $third=$second[0]; 
      }
?>

我花了4个小时试图自己找出答案。任何帮助将不胜感激...

2 个答案:

答案 0 :(得分:1)

class="FootNotes2"不在tr中,但是在td中也许会改变您的结果

编辑:

在这种情况下,您的Rexeg不正确。您搜索<td class="FootNotes2",但是在<tdclass="FootNotes2"之间,您还具有其他属性

将正则表达式更改为<td .*? class="FootNotes2">(.*?)<\/td>可能会对您有所帮助

您可以使用https://regex101.com/进行测试。我在其中放置了curl响应,并更改了您的正则表达式以在那里进行测试

再次编辑:

我希望更好地查看您的代码,并查看您尝试抓取的网站。 但是您有办法解决代码中的许多错误。在循环中,您假设值存在而未检查,则尝试重新排列在您尝试抓取的页面中不存在的值和样式。复制该页面的html并进行研究,并在正则表达式测试器中对其进行测试,然后将结果var_dump转储到从函数返回的结果中,并进行检查以确保您想使用的数据存在。逐步执行此操作,您将获得结果。

答案 1 :(得分:0)

<?php
    function con(){
            $q=mysqli_connect('localhost','root','','usmle');
            return $q;
    }
    function addquery($a,$b,$c,$d){
            $a=mysqli_real_escape_string(con(),$a);
            $b=mysqli_real_escape_string(con(),$b);
            $c=mysqli_real_escape_string(con(),$c);
            $d=mysqli_real_escape_string(con(),$d);
            mysqli_query(con(),"insert into query(Query,QueryBy,QueryLink,Date)values('$a','$b','$c','$d')");
    }
    function addreply($a,$b){
        $a=mysqli_real_escape_string(con(),$a);
        $b=mysqli_real_escape_string(con(),$b);
        mysqli_query(con(),"insert into replies(QueryID,Reply)values($a,'$b')");
    }
    
    function lastID(){
        $q=mysqli_query(con(),"select MAX(QueryID) as LastID from query LIMIT 1");
        return $q;
    }
    function getSslPage($url){

        $ch = curl_init();      
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
        curl_setopt($ch, CURLOPT_COOKIEJAR,   "cookie.txt");
        curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
        curl_setopt($ch, CURLOPT_USERAGENT, "Chrome/36.0.1985.125");
        $login = curl_exec($ch);
        return $login;
    }
    function cleannr($str)
{
//     $str = str_replace("£", "", $str);
    $str = str_replace(array("\r\n", "\n\r", "\n", "\r"), ',', $str);
    $str = str_replace("\n" , "" , $str);
    $str = trim(strip_tags($str));
    return str_replace("," , " " , $str);
}
$set=0;
    $athomepage  = getSslPage('http://www.usmleforum.com/forum/index.php?forum=1&Page=1'); 
    preg_match_all('/<td width="64%" height="25" class="FootNotes2"><a href="(.*?)" target="_top" class="Links2">(.*?)<\/a>(.*?)<\/td>/s',$athomepage,$pages);
    
                /*  $count = $pages[2][0];
                 $total_pages = 1;
                
                 if($count > 0){
                     $pages = $pages[0][$count-1];
                     $total_pages = strip_tags($pages);
                
                 } */
                 // echo $total_pages;
                 // die;
            // echo "<pre>".print_r($listres,true)."</pre>";
                // die;
                foreach($pages[1] as $links){
                    ob_flush();
                    flush();
                    $set++;
                    echo 'Query No.'.$set.'<br />'; 
                    //echo "https://www.immobilienscout24.de/Suche/controller/exposeNavigation/goToExpose.go?exposeId=".$links."<br>";
                     //die;
                     $link="http://www.usmleforum.com".$links;
                     $ipage=getSslPage("http://www.usmleforum.com".$links."");
                     preg_match_all('/<td width="95%" valign="top" colspan="2" class="FormText2">(.*?)<\/td>/s',$ipage,$query);
                     preg_match_all('/<td width="97%" colspan="2" valign="top" class="FootNotes2">(.*?)<\/td>/s',$ipage,$by);
                    
                     $explodation=explode("-",$by[1][0]);
                    $date=$explodation[1];
                    $name=$explodation[0];
                    $actualquery=cleannr($query[1][0]);
                    echo '<h2>Query : </h2><br />';
                    echo 'Query : '.$actualquery.'<br />'; 
                    echo 'Query By : '.$name.'<br />'; 
                    echo 'Link : '.$link.'<br />'; 
                    echo 'Date : '.$date.'<br />'; 
                    
                    addquery($actualquery,$name,$link,$date);
                    
                    $id=lastID();
                    foreach($id as $ids){
                        $lastID=$ids["LastID"];
                    } 
                echo '<h2>Replies : </h2><br />';
                for($i=1;$i<count($query[1]);$i++){
                    if($query[1][$i]!=""){
                        $replyquery=cleannr($query[1][$i]);
                        
                        echo 'Reply : '.$replyquery.'<br />';                   
                        addreply($lastID,$replyquery);
                    }
                }
                
                     
                }
                    echo "<center><h2>Scraping Done</h2></center>";
?>

钉了它。