phpspider在列表页生成内容采集url.(又名:如何通过搜狗搜索关键词

优采云 发布时间: 2020-08-21 02:18

  phpspider在列表页生成内容采集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>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线