phpspider在列表页生成内容采集url.(又名:如何通过搜狗搜索关键词
优采云 发布时间: 2020-08-21 02:18phpspider在列表页生成内容采集url.(又名:如何通过搜狗搜索关键词
需要采集一些电台相关的新闻,百度搜索了一下,本来思路是进去网易,或者搜狐啥的小型新闻平台进行搜索后,进行关键词爬取.
结果发觉网易新闻没有搜索新闻的入口,然后搜狐搜索下来的新闻好多是视频筛选比较困难,也有点难搞..
后来发觉搜狗他爬取收录了各类平台的新闻内容页,这真的就是:可恨年年压银线,为别人作嫁衣裳...刚好实惠了我,嘿嘿
于是决定爬取搜狗的搜索页,
1.先提取url
%+%B5%E7%CC%A8&_ast=1585809152&_asf=&time=0&w=03009900&sort=0&mode=2&manual=true&dp=1
2.之后获取他列表页的规则
进入 这个网站,可以快速写个正则匹配就行了,其实就是找到分页的page参数数组,然后把值改成正则的数字,替换一下就完事儿了..简简单单,把规律找到
3.详情页的匹配规则,
因为详情页都是以.结尾的url,所以,他的正则也挺好写
((https|http)?:\/\/)[^\s]{1,6}.sina.com.cn/[a-z]{1,10}/.*.shtml
4.下面讲一些自己踩的坑
4.1:在搜狗搜索页下边,获取不到内容详情页的url
原因:因为domains主域名须要你把你采集的内容页和详情页的开头的域名都给填上,不填就是不会采集的..所以我的domains下边填写了一大串新浪的二级域名
4.2:采集到不该采集的文章详情去了,我只想要搜索的文章结果的url
分析:phpspider通常情况是按照你config中的content_url_regexes来正则匹配列表页中的url,然后提起下来,作为详情页采集..这样它还会采集到一些不属于搜索内容的url.
做法:重写spider的on_list_page方式,直接把列表页上面的html,通过selector把须要的url元素提取下来,然后插入内容页,并且返回false,不再插入其他获得的内容url
//采集列表页
$spider->on_list_page = function($page, $content, $phpspider)
{
// 在列表页中通过XPath提取到内容页URL 这里获取的是数组,所以下面要进行循环
$content_url = \phpspider\core\selector::select($content,"//h3[@class='vrTitle']/a/@href");
if(!empty($content_url)){
foreach ($content_url as $k=>$v){
$phpspider->add_url($v);
}
}
return false;
};
4.3怎么匹配多个规则,比如有些文章的内容div的id是article,有的又是article_content
分析:使用xpath上面的一个叫或则的东西,使用如下,就把不同的规则通过一个"|"分割开了,一开始没注意到,后来觉得非常好用
'selector' => "//div[@id='article_content']//p|//div[@id='article']//p|//div[@class='img_wrapper']",
4.4获取的内容可能是链表,怎么办?
在设置上面设置repeat为true,使用方式可以搜索文档具体查看
我的用法是,获取文章内容上面的P标签,和图片标签,因为上面还有啥嵌入的广告,这样那样的东西,一个个去排除太麻烦了,我TM干脆直接获取上面的p和图片,就完事儿了,然后我自己拼接成字符串儿..
config配置:
[
'name' => "content",//网站内容
'selector' => "//div[@id='article_content']//p|//div[@id='article']//p|//div[@class='img_wrapper']",
'required'=>false,
'repeated' => true,
],
采集到的结果后,进行处理的on_extract_field函数,直接给它判定,有图片,就用div拼接图片,否则,就拼接个p标签,给串成字符串儿..然后用转json,压缩成字符串,转base64,存数据库(占用的空间少)
//详情页=>提取字段=>处理字段
$spider->on_extract_field = function($fieldname, $data, $page)
{
if($fieldname=='content'){
$data_str='';
if(!empty($data)){
//循环拼接成字符串
foreach ($data as $k=>$v){
if(strstr($v,"img")!==false){
$data_str.="".$v."";
}else{
$data_str.="<p>".$v."";
}
}
$content=json_encode($data_str,JSON_UNESCAPED_UNICODE);//转成json
$content_gz=gzcompress($content);//压缩字符串
$data=base64_encode($content_gz);//组成base64
}else{
$data='';
}
return $data;
}
return $data;
};</p>
5.上咱的代码
注意:这里的phpspider引用路劲,需要根据自己的实际路由引用..然后我把数据库配置单独写了一个config.php作为所有采集文件公共的引入文件
<p>