抓取数据就像是同网页做斗争,自己在这里记录下自己做斗争的这个过程,一步一步来。
前两个网页抓取的都很顺利,但是到了果壳网发现以前用的方法不行了,于是换用curl:
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL,"http://mooc.guokr.com/search/course/?wd=qq");
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$contents3 = curl_exec($ch);
curl_close($ch);
$regex6="/<ul class="course_list".*?>.*?</ul>/ism";
if(preg_match_all($regex6, $contents3, $matchs3)){
// echo($matchs3[0][0]);
}else{
echo '0';
}
echo "<hr/>";
然后自己发现到了极客学院,自己上面的方法又不行了,抓取到的不是有用的数据反而是没什么用处的 网页说浏览器错误,原因是自己没有声明浏览器类型:
$UserAgent = 'Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://www.jikexueyuan.com/search/s/q_%E5%BE%AE%E4%BF%A1');
curl_setopt($curl, CURLOPT_USERAGENT, $UserAgent);
$data = curl_exec($curl);
然后接下来是网易云课堂,于是乎自己的上面的方法又不行了。一会再说网易云课堂这个鬼,因为它是用js的ajax动态加载的内容,所以就比较蛋疼。
于是乎自己先抓了淘宝,但是发现抓淘宝的时候又有一个问题就是淘宝教育的编码并不是utf-8,于是自己在淘宝的抓取上用了这样一个函数:
function safeEncoding($str){
$code=mb_detect_encoding($str,array('ASCII','GB2312','GBK','UTF-8'));//检测字符串编码
if($code=="CP936"){
$result=$str;
}
else{
//$result=mb_convert_encoding($str,'UTF-8',$code);//将编码$code转换为utf-8编码
$result=iconv($code,"UTF-8",$str);
}
return $result;
}
只要对结果使用这个函数就没有什么问题了。
然后自己在抓取开课吧的时候,又发现了一个新的问题: 开课吧的网址链接是相对链接的,自己需要替换成绝对链接,用正则替换或者一般的字符串替换替换成一般的绝对链接就可以:
下面自己给了两个方法:
$body=fcontents($url10,$cookie);
$body=preg_replace("/href="/courses//u","href="http://www.kaikeba.com/courses/",$body);
$regex9="/<ul class="list-unstyled course-row".*?</ul>/ism";
if(preg_match_all($regex9, $body, $matchs5)){
$temp=$matchs5[0][0];
// echo gettype($temp);
// $temp=str_replace("href="/courses","href="http://www.kaikeba.com/courses",$temp);
echo($temp);
}else{
echo '0';
}