这里的小红书爬虫和上篇的微信公众号文章爬虫差不多,可以互相借鉴一下,但内容源地址的传输的时候注意下,小红书为文章地址第一次进入的时候不是真正的地址,可以将地址复制到别的浏览器解析一下,内容源地址会在“?_at=”后面跟上参数,这才是真正的地址
/**
* 爬虫逻辑
* 获取html内容
*/
public function crawler($centent_url)
{
//接收内容源地址
$request = $centent_url;
$html = $this->getUrlContent($request);
$relwvantart = array();
//获取文章主要内容
preg_match_all("/class=\"content\" data-v-331b5d4b>(.*)<div/iUs",$html,$content,PREG_PATTERN_ORDER);
$content = "<div class='content' data-v-331b5d4b>".$content[1][0];
//文章中的emojis表情处理
// $tmpstr = $this->userTextEncode($content);
// $content = $this->userTextDecode($tmpstr);
// print_r($content);
//这里的文章内容中会有作者加入的emojis表情,所以要重新编码一下,再查询的时候要用htmlspecialchars_decode()和base64_decode()处理一下
$relwvantart['content'] = base64_encode($content);
//获取文章标题
preg_match_all("/<h3 class=\"title\" data-v-64a04a28>(.*)<\/h3>/iUs",$html,$title,PREG_PATTERN_ORDER);
$title = $title[1][0];
$relwvantart['title'] = $title;
if (empty($title)){
//获取meta里的description当标题
preg_match_all("/<meta name=\"description\" content=\"(.*)\">/iUs",$html,$desc,PREG_PATTERN_ORDER);
$desc = $desc[1][0];
$relwvantart['title'] = $desc;
}
//获取缩略图板块内容
preg_match_all("/<span class=\"inner\" style=\"background-image:url((.*));\" data-v-a16c5c68>/iUs",$html,$temp,PREG_PATTERN_ORDER);
$tempicon = $temp[1];
$img_url = array();
//图片路径处理
foreach ($tempicon as $k => $v){
$img_url[$k] = str_replace('(','https:',$v);
}
foreach($img_url as $key => $value){
$img_url[$key] = str_replace(')','',$value);
}
//将图片保存在本地并上传oss
foreach ($img_url as $i => $j){
$res = $this->crabImage($j);
$imgurl[$i] = $res['save_path'];
}
// print_r($res);
$relwvantart['img'] = $imgurl;
return $relwvantart;
}
/**
* 爬虫程序
* 从给定的url获取html内容
* @param string $url
* @return string
*/
function getUrlContent($request) {
$handle = fopen($request, "r");
if ($handle) {
$content = stream_get_contents($handle, -1);
//读取资源流到一个字符串,第二个参数需要读取的最大的字节数。默认是-1(读取全部的缓冲数据)
// $content = file_get_contents($url, 1024 * 1024);
return $content;
} else {
return false;
}
}