注:如果你需要写一个关于PHP检测URL是否被百度收录的程序,这篇文章的内容一定会帮到你,本文详细讲述了常见的错误并给出了可用的例子和封装好的接口。
开发背景
新手站长很容易面临一个问题,SEO优化,因此诞生了各种收录提交插件等工具。然而,一味地提交收录在很多时候是无用功,因为你向百度蜘蛛提交的链接很可能是已经收录了的。因此我们需要来判断一个链接是否已经被百度收录。
我通过百度找到了很多类似的例子,但都已无法使用。大部分实现方式都为curl抓取https://www.baidu.com/s?wd=,而这种方式理论上虽然可行,但在我实际测试中发现了很多问题。
一、问题汇总
1.抓取乱码(响应Content-Encoding: br)
出现这种情况是因为百度默认采用br(Brotli)来压缩页面,这是一种压速率高于gzip的压缩方式,因此返回回来的数据无法被读取就会出现乱码,需要先将请求头中附带
'Accept-Encoding: gzip'
使得返回的网页为gzip方式压缩,然后进行通过下面函数进行解码
$data = gzdecode($data);
这样就可以抓取到可读的页面。
2.抓取不到(输出抓取的内容显示Found.)
这是因为你在进行抓取的时候,百度弹出来一个验证码,所以才会这样。出现这种情况你需要在请求头中附带上一些参数以伪造成正常的搜索。推荐可以直接访问一下https://www.baidu.com/s?wd=xxx,然后按下F12,找到请求参数,全部复制到curl的请求头里。
如图:
将他们全部复制到curl的请求头里
现在就可以正常请求到了~
二、实现功能
问题解决之后,接下来就要实现我们需要的功能,直接上代码然后通过注释进行解读。
$url = 'https://www.baidu.com/s?tn=baidu&oq='.$url.'&wd='.$url; //这里的$url是需要检测是否被收录的url $curl = curl_init(); //初始化curl curl_setopt($curl, CURLOPT_URL, $url); //设置抓取 curl_setopt ($curl, CURLOPT_HTTPHEADER, $header ); //将上面我们模拟的请求头一并发送 curl_setopt($curl, CURLOPT_FOLLOWLOCATION,1); //跟踪到重定向地址,搜索很有可能会重定向,务必启用! curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //设置返回值不直接输出 $data = curl_exec($curl); //这里返回的就是最终抓取到百度的搜索页面了通过这样一番操作下来,百度的页面大致就被咱们抓取成功了。
我们输出一下抓取到的数据
echo $data;
大致是这样,我们可以看到在我的接口中已经抓取到了,注意看浏览器地址栏,这个页面是显示在我接口地址中输出的。
我们抓取到的信息,如果显示了没有找到URL,就代表没有收录,如果没有,则代表收录了,所以通过这个原理来判断是否被收录
上代码
if(strpos($data, '没有找到该URL') || strpos($data, '很抱歉') || strpos($data, '抱歉')) { echo "暂未被收录";//如果存在这些文本则是未收录 } else { echo "已经收录"; }
至此,我们就实现了目标功能!
三、封装接口
为了方便调用,我封装了一个接口
接口地址:https://zhuyansong.com/api/bd.php
返回格式:json/text
请求方式:get/post
请求示例:https://zhuyansong.com/api/bd.php?url=https://www.baidu.com
请求参数说明:
名称 | 必填 | 类型 | 说明 |
url | 是 | string | 需要被检测的url地址 |
返回参数说明:
名称 | 类型 | 说明 |
code | int |
返回的状态码 |
url | string | 您提交检测的url地址 |
msg | string | 查询返回的提示信息 |
respond |
int | 收录状态信息(0为未收录,1为收录) |
info | string | 收录查询提示信息 |
time | string | 检测的时间 |
返回示例:
{"code":0,"url":"https:\/\/zhuyansong.com\/wz\/42.html","msg":"查询成功","respond":1,"info":"已被收录","time":"2023-04-13 17:36:14"}
完美实现目标效果,感谢您的阅读。如有问题,请留言评论~
发表评论