我正在尝试使用网络爬虫(以下代码)提取此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个小时试图自己找出答案。任何帮助将不胜感激...
答案 0 :(得分:1)
类class="FootNotes2"
不在tr
中,但是在td
中也许会改变您的结果
编辑:
在这种情况下,您的Rexeg不正确。您搜索<td class="FootNotes2"
,但是在<td
和class="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>";
?>
钉了它。