如何用PHP和MySQL从网站抓取日期并存储到数据库
抓取日期并以Y-m-d格式存入数据库的解决方案
嘿,你已经搞定了最棘手的网页抓取部分,剩下的日期格式转换和数据库存储其实没那么复杂,我给你一步步捋清楚:
第一步:把抓取到的日期转成Y-m-d格式
不管你从页面抓下来的日期是啥样的(比如"20 May 2024"、"May 20, 2024"或者其他格式),PHP的DateTime类都能帮你轻松转成标准的Y-m-d格式。
举个实际的例子:
// 假设你从页面提取到的原始日期字符串 $raw_date = "20 May 2024"; // 用DateTime解析日期,如果格式固定,也可以指定格式(比如这里的'd M Y'对应日 月 年) $date_obj = DateTime::createFromFormat('d M Y', $raw_date); // 如果不确定格式,也可以直接用new DateTime($raw_date),PHP会自动识别大部分合法格式 // 转成Y-m-d格式 $formatted_date = $date_obj->format('Y-m-d'); // 验证一下,输出应该是2024-05-20 echo $formatted_date;
如果遇到解析失败的情况,记得加个try-catch块捕获错误,方便排查是哪个日期格式出了问题。
第二步:把格式化后的日期存入数据库
假设你用的是MySQL(最常用的数据库),这里用PDO来操作,比mysqli更安全也更灵活:
1. 先连接数据库
// 替换成你的数据库信息 $dsn = 'mysql:host=localhost;dbname=你的数据库名;charset=utf8mb4'; $db_user = '你的用户名'; $db_pass = '你的密码'; try { $pdo = new PDO($dsn, $db_user, $db_pass); // 设置错误模式为异常,方便捕获问题 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die("数据库连不上:" . $e->getMessage()); }
2. 插入日期到表中
假设你的表叫events,有个event_date字段(类型选DATE就行,刚好匹配Y-m-d格式),用预处理语句插入,避免SQL注入:
// 假设已经得到了转好格式的$formatted_date $sql = "INSERT INTO events (event_date) VALUES (:event_date)"; $stmt = $pdo->prepare($sql); // 绑定参数,自动处理转义 $stmt->bindParam(':event_date', $formatted_date); // 执行插入 $stmt->execute(); echo "这个日期成功存进数据库啦!";
整合到你的curl代码里的完整示例
把上面的步骤和你已有的curl抓取代码结合起来,大概是这样:
// 你的curl抓取部分 $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'https://www.brent.gov.uk/events-and-whats-on-calendar/?eventCat=Wembley+Stadium+events'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); $html_content = curl_exec($curl); curl_close($curl); // 连接数据库(替换成你的信息) $dsn = 'mysql:host=localhost;dbname=your_db;charset=utf8mb4'; $db_user = 'your_user'; $db_pass = 'your_pass'; try { $pdo = new PDO($dsn, $db_user, $db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die("数据库连接失败:" . $e->getMessage()); } // 解析HTML提取日期(这里需要你根据目标页面的实际结构调整选择器) $dom = new DOMDocument(); @$dom->loadHTML($html_content); // @忽略HTML解析的警告 $xpath = new DOMXPath($dom); // 假设日期在class为event-date的div里,你要自己去页面源码找对应的元素哦 $date_nodes = $xpath->query("//div[@class='event-date']"); foreach ($date_nodes as $node) { $raw_date = trim($node->nodeValue); try { // 转换日期格式 $date_obj = new DateTime($raw_date); $formatted_date = $date_obj->format('Y-m-d'); // 插入数据库 $sql = "INSERT INTO events (event_date) VALUES (:event_date)"; $stmt = $pdo->prepare($sql); $stmt->bindParam(':event_date', $formatted_date); $stmt->execute(); echo "成功存储日期:{$formatted_date}<br>"; } catch (Exception $e) { echo "处理日期【{$raw_date}】失败:{$e->getMessage()}<br>"; } }
几个关键注意点
- 调整选择器:上面的XPath路径
//div[@class='event-date']是示例,你得自己打开目标网站的开发者工具,找到日期元素的实际类名或标签,修改成正确的选择器。 - 日期格式适配:如果遇到特殊格式的日期,比如"2024/05/20",就用
DateTime::createFromFormat('Y/m/d', $raw_date)来指定解析格式,别让PHP瞎猜。 - 数据库字段类型:一定要确保
event_date字段的类型是DATE,这样存Y-m-d格式的字符串才不会出问题。 - 错误处理:加try-catch真的很重要,能帮你快速定位是日期解析错了还是数据库连接出问题了。
内容的提问来源于stack exchange,提问作者Pruthvi Lalji
相关产品推荐
相关产品推荐

