当前位置: 首页 > news >正文

PHP编写图书信息爬虫程序

最近闲来无事,有个朋友问我他在用PHP写一个抓取图书信息的爬虫程序出现了一些BUG,想要让我看下帮他修改,无奈写的语法太过复杂凌乱,索性我重头再来,直接用自己的方式写了一篇给他一些思路做参考。

在这里插入图片描述

以下是一个使用PHP编写的简单图书信息爬虫示例,使用 GuzzleHttp 发送HTTP请求和 Symfony DomCrawler 解析HTML内容:

<?php
require 'vendor/autoload.php';use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;// 创建HTTP客户端
$client = new Client(['headers' => ['User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36']
]);// 存储结果的CSV文件
$csvFile = fopen('books.csv', 'w');
fputcsv($csvFile, ['书名', '作者', '价格', '评分', '简介']);// 示例:爬取豆瓣读书的编程类书籍(实际使用时请遵守网站规则)
$baseUrl = 'https://book.douban.com/tag/编程?start=%d';for ($page = 0; $page < 3; $page += 20) { // 爬取3页try {$response = $client->get(sprintf($baseUrl, $page));$html = (string)$response->getBody();$crawler = new Crawler($html);// 提取图书信息$crawler->filter('li.subject-item')->each(function (Crawler $node) use ($csvFile) {$title = $node->filter('h2 a')->text();$info = $node->filter('.pub')->text();$rating = $node->filter('.rating_nums')->text('暂无评分');$desc = $node->filter('.info p')->text('暂无简介');// 清理数据$info = trim(str_replace(["\n", " "], "", $info));list($author, $publisher, $price) = explode('/', $info, 3) + ['', '', ''];fputcsv($csvFile, [trim($title),trim($author),trim($price),trim($rating),trim($desc)]);});echo "已抓取第 ".($page/20+1)." 页数据\n";sleep(1); // 遵守爬虫道德,添加延迟} catch (Exception $e) {echo "抓取失败: ".$e->getMessage()."\n";}
}fclose($csvFile);
echo "数据已保存到 books.csv\n";

使用说明

  1. 安装依赖

    composer require guzzlehttp/guzzle symfony/dom-crawler
    
  2. 注意事项

    • 需遵守目标网站的robots.txt规则
    • 添加适当的请求延迟(示例中为1秒)
    • 需要处理可能出现的反爬机制(验证码、IP封禁等)
    • 实际应用中建议使用代理IP池

核心功能说明

  1. HTTP请求

    • 使用Guzzle模拟浏览器请求
    • 添加User-Agent头避免被简单拦截
  2. 数据解析

    • 通过CSS选择器定位元素
    • 提取书名、作者、价格等信息
    • 处理可能缺失的数据字段
  3. 数据存储

    • 使用CSV格式存储结果
    • 包含字段:书名、作者、价格、评分、简介
  4. 分页处理

    • 通过URL参数控制分页
    • 示例抓取3页数据(可调整循环次数)

扩展建议

  1. 反爬应对
// 随机延迟
sleep(rand(1, 3));// 使用代理
$client = new Client(['proxy' => 'http://user:pass@proxy:port'
]);
  1. 数据库存储
// 使用PDO存储到MySQL
$pdo = new PDO('mysql:host=localhost;dbname=books', 'user', 'pass');
$stmt = $pdo->prepare("INSERT INTO books (...) VALUES (...)");
$stmt->execute([...]);
  1. 异步请求
// 使用Guzzle的异步并发
$promises = [];
foreach ($urls as $url) {$promises[] = $client->getAsync($url);
}
$results = GuzzleHttp\Promise\unwrap($promises);

上面就是我所编写的全部过程,不过如果有更好的方案或者建议可以评论区留言讨论。

相关文章:

  • 跨域问题深度解析与解决方案
  • rbac模型详解
  • Go语言多线程爬虫与代理IP反爬
  • 【Java继承】——面向对象编程的基石
  • 从经典力扣题发掘DFS与记忆化搜索的本质 -从矩阵最长递增路径入手 一步步探究dfs思维优化与编程深度思考
  • 互联网大厂Java求职面试实战:Spring Boot与微服务场景深度解析
  • 鸿蒙HarmonyOS list优化一: list 结合 lazyforeach用法
  • yarn workspace使用指南
  • 精品可编辑PPT | 全面风险管理信息系统项目建设风控一体化标准方案
  • 数据库实验报告 SQL SERVER 2008的基本操作 1
  • 企业对数据集成工具的需求及 ETL 工具工作原理详解
  • 一键生成达梦、Oracle、MySQL 数据库 ER 图!解锁高效数据库设计!
  • 《基于 Kubernetes 的 WordPress 高可用部署实践:从 MariaDB 到 Nginx 反向代理》
  • PostgreSQL 序列(Sequence) 与 Oracle 序列对比
  • springboot集成langchain4j实现票务助手实战
  • 视觉-语言-动作模型:概念、进展、应用与挑战(上)
  • 基于Django和机器学习实现的中风预测系统
  • web 自动化之 selenium 下拉鼠标键盘文件上传
  • 【Linux网络编程】HTTPS协议原理
  • MySQL全量,增量备份与恢复
  • 印称印巴军事行动总指挥同意将局势降级
  • 山西省委常委李金科添新职
  • 国家统计局今年将在全国开展两次人口固定样本跟访调查
  • 未来之城湖州,正在书写怎样的城市未来
  • 马上评丨维护学术诚信别陷入“唯AI检测”误区
  • 虚假认定实质性重组、高估不良债权价值,原中国华融资产重庆分公司被罚180万元