当前位置:首页 > SEO工具 > 正文

如何用PHP自制一个SEO爬虫工具? 实际使用中有哪些常见问题需要规避?

大家好,我是贝贝。
今天咱们聊聊用PHP写SEO爬虫工具这件事。

如何用PHP自制一个SEO爬虫工具? 实际使用中有哪些常见问题需要规避?

为什么要自己写爬虫

市面上现成的SEO工具很多。
但有时候它们不太合心意。
要么功能太多用不上,要么想查的数据没有。
自己写的话,灵活,想抓什么就抓什么。
成本也低,一台服务器就能跑起来。

核心思路和准备工作

爬虫说白了就是模仿浏览器访问网页。
然后把网页内容拿回来分析。
用PHP做,主要是用到cURL或者file_get_contents函数。
我习惯用cURL,因为能设置的参数多,控制更细。

开始前,你得确保服务器环境支持:

  • PHP版本最好在7.4以上
  • 开启cURL扩展
  • 如果需要处理大量HTML,建议装个DOM解析扩展

基础爬虫代码搭建

先写一个最简单的函数,用来抓取网页内容。

function fetchUrl($url) {

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

curl_setopt($ch, CURLOPT_TIMEOUT, 10);

$result = curl_exec($ch);

curl_close($ch);

return $result;

}

这段代码设置了几个关键参数。
CURLOPT_RETURNTRANSFER 让结果以字符串返回。
CURLOPT_FOLLOWLOCATION 会自动跟进301、302跳转。
TIMEOUT设成10秒,防止某个页面卡住太久。

处理反爬机制

现在很多网站有反爬措施。
直接爬可能会被屏蔽。
有几个常见的处理办法。

  1. 设置User-Agent,把自己伪装成普通浏览器。
  2. 在请求头里加上Referer。
  3. 控制访问频率,爬一个页面后sleep一下。
  4. 使用代理IP池,轮流换IP访问。

在代码里加上请求头大概是这样的:

$headers = [

'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',

'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'Accept-Language: zh-CN,zh;q=0.9',

];

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

解析HTML提取数据

抓回来的是完整的HTML代码。
我们需要从中提取有用的部分。
比如标题、描述、H1标签、出站链接这些。

不建议用正则表达式去匹配,容易出错。
最好用DOM解析器。
PHP可以用内置的DOMDocument类。

$dom = new DOMDocument();

@$dom->loadHTML($htmlContent);

$titleTags = $dom->getElementsByTagName('title');

if ($titleTags->length > 0) {

$pageTitle = $titleTags->item(0)->nodeValue;

}

用getElementsByTagName可以拿到各种标签。
取链接就用`a`标签,取图片就用`img`标签。

针对SEO的数据分析

光把数据抓下来不够,得分析。
下面这几个是SEO里常看的点。

  • 页面标题和元描述的长度是否合适
  • H1标签是否唯一,内容是什么
  • 图片有没有alt属性
  • 页面内链和外链的数量和质量
  • 页面大小和加载速度预估

可以写一些函数来专门检查这些项目。
比如检查标题长度:

function checkTitleLength($title) {

$len = mb_strlen($title, 'UTF-8');

if ($len < 10) return '太短';

if ($len > 60) return '太长';

return '合适';

}

数据存储和后续处理

爬下来的数据得存起来。
数据量小的话,存文本文件或SQLite就行。
数据量大或者要频繁查询,建议用MySQL。

设计数据表的时候,至少要有这些字段:

字段名类型说明
idINT自增主键
urlVARCHAR(500)爬取的网址
titleVARCHAR(200)页面标题
status_codeINTHTTP状态码
fetch_timeDATETIME抓取时间

存到数据库后,分析就方便了。
可以写SQL语句统计标题的平均长度。
或者找出所有没有H1标签的页面。

效率优化和任务调度

如果要爬的网站很多,得考虑效率。
单线程爬太慢,可以考虑多线程。
但PHP本身对多线程支持不算好。
一个变通的办法是用多个进程。

可以把要爬的URL列表分成几份。
然后同时运行多个PHP脚本,各爬一份。
用Linux的crontab来定时启动爬虫任务。

比如每天凌晨2点跑一次:

0 2*/usr/bin/php /path/to/your/crawler.php

实际使用中遇到的坑

最后说说我遇到过的一些问题。

  • 编码问题。有些页面是GBK,有些是UTF-8,得统一转码。
  • JavaScript渲染的内容抓不到。需要用无头浏览器,比如Puppeteer,但那样更重。
  • 对方服务器不稳定,偶尔超时。代码里要有重试机制。
  • 爬虫程序跑久了内存占用上涨。记得及时释放DOM对象,unset掉大变量。

还有一点很重要,要尊重robots.txt。
爬之前先检查一下目标网站的robots文件。
别去爬人家明确禁止的目录。
控制好爬取频率,别把人家服务器搞垮了。

大概就是这些内容。
自己写爬虫听起来复杂,但拆开一步步做,其实能搞定。
关键是先跑通一个最简单的流程,然后再慢慢加功能。

最新文章