php脚本如何检测一个网站有新的文章发布

  1. AutoCMS
  2. /
  3. 建站资讯
  4. /
  5. 网站
logo
雷伦瑗

网站  2026-10-27 21:00:02   162

php脚本如何检测一个网站有新的文章发布

检测一个网站有没有新文章,最省事的入口通常是RSS。很多内容站、博客、新闻站都会暴露/feed、/rss.xml、/atom.xml,PHP用SimpleXML几行就能读。核心不是“抓”,而是“记住上次看到什么”,下次只比对新增项。我一般把每篇文章的链接和标题拼成指纹,存到本地JSON或SQLite,脚本每次拉取后做差集。

示例:

$feedUrl = ''https://www.example.com/feed'';
  $cacheFile = __DIR__ . ''/seen.json'';
  $seen = file_exists($cacheFile) ? json_decode(file_get_contents($cacheFile), true) : [];
  $xml = simplexml_load_file($feedUrl, ''SimpleXMLElement'', LIBXML_NOCDATA);
  if ($xml === false) {
   error_log(''feed读取失败'');
   exit;
  }
  $items = [];
  foreach ($xml->channel->item as $item) {
   $title = trim((string)$item->title);
   $link = trim((string)$item->link);
   $id = md5($link . $title);
   if (!isset($seen[$id])) {
   $items[] = [''title'' => $title, ''link'' => $link];
   $seen[$id] = time();
   }
  }
  file_put_contents($cacheFile, json_encode(array_slice($seen, -500, true)));
  // $items就是新文章,可以发邮件、写日志或推送

Atom源结构不一样,取entry、link的href属性、updated时间。RSS的pubDate用strtotime转时间戳,但有些源时区乱,比较指纹比比较时间可靠。缓存别无限涨,只留最近几百条。读取前加锁,避免定时任务重叠。

站点没RSS就抓列表页,用DOMDocument和XPath,别用正则。列表页结构稳定时,取文章链接:

$html = file_get_contents($url, false, stream_context_create([
   ''http'' => [''header'' => "User-Agent: Mozilla/5.0\r\n", ''timeout'' => 10]
  ]));
  libxml_use_internal_errors(true);
  $dom = new DOMDocument();
  $dom->loadHTML($html);
  $xpath = new DOMXPath($dom);
  foreach ($xpath->query(''//article//h2/a'') as $a) {
   $title = trim($a->textContent);
   $href = $a->getAttribute(''href'');
   // 相对链接补全域名,再算指纹
  }

列表页可能分页,先抓首页通常够用;要全量就解析下一页,但别递归太深。动态渲染的站,HTML里没有文章内容,PHP直接抓不到,得找它的JSON接口,或者用Playwright、Puppeteer跑无头浏览器,PHP调命令行。正则不是不能写,是结构一变就废,维护成本高。

sitemap也值得看。新闻站常有sitemap.xml,里面url的lastmod能判断新页面。解析urlset,比较lastmod和上次记录,比抓列表页干净,但更新不一定及时,适合辅助。存储去重方面,JSON文件适合小站,SQLite适合量多。表里存id、title、url、published_at、first_seen,id做主键,INSERT OR IGNORE。指纹别只用标题,标题会改;链接加标题比较稳。有的站链接带utm参数,先去掉再算。

调度用cron,五到十五分钟一次看需求。请求加User-Agent,遵守robots.txt,别并发打。失败重试两三次,记录状态码。缓存文件加锁,避免cron重叠。先RSS,再sitemap,最后HTML,基本能覆盖大多数站。