爬虫实战:使用PHP爬取携程旅游信息

随着旅游业的不断发展,旅游信息变得非常丰富。为了方便大家获取更全面、准确的旅游信息,我们可以使用爬虫来抓取旅游网站上的数据,并进行分析和处理。本文将介绍如何使用php爬取携程旅游信息。

  1. 爬虫基础知识

爬虫是一种自动化程序,可以模拟用户访问网站并获取网站上的数据。爬虫一般分为以下几步:

  1. 发起请求:爬虫程序会向目标网站发起HTTP请求,获取目标网站的HTML代码。
  2. 解析HTML:使用适当的解析器对HTML代码进行解析,并获取需要的数据。常见的解析器有正则表达式、XPath和DOM解析器等。
  3. 存储数据:将获取到的数据存储到文件或数据库中,以便后续分析和处理。
  4. 目标网站分析

在编写爬虫之前,首先需要分析目标网站的结构和数据。本次爬虫的目标网站是携程旅游网站。我们需要分析该网站的URL结构和HTML代码,以确定请求方式和解析方式。

2.1 URL结构分析

携程旅游网站的URL结构比较简单,每个旅游产品都有一个唯一的ID号。以浏览北京旅游为例,其URL为:https://you.ctrip.com/sight/beijing1.html。其中,beijing1表示北京旅游的ID号。

立即学习“PHP免费学习笔记(深入)”;

2.2 HTML代码分析

使用Chrome浏览器的开发者工具查看该网页的HTML代码,可以发现页面上的旅游信息都在一个class为“list_mod2”的div中。该div中包含了每个旅游产品的详细信息,包括产品名称、价格、评价等。在爬虫程序中,我们需要使用PHP的DOM解析器来解析这些信息。

  1. 爬虫程序编写

现在我们已经了解了目标网站的URL结构和HTML代码,可以编写爬虫程序来获取旅游信息。

3.1 发起HTTP请求

首先,我们需要使用PHP的cURL库来向目标网站发起HTTP请求,获取目标网站的HTML代码。在代码中,我们使用了一个循环,从ID=1开始,依次获取各个旅游产品的详细信息。

1

2

3

4

5

6

7

8

9

//爬取ID号从1到n的旅游产品的详细信息

for($i=1;$i<=$n;$i++){

    $url = "https://you.ctrip.com/sight/beijing$i.html"; //目标网站URL

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $html = curl_exec($ch);

    curl_close($ch);

    }

3.2 解析HTML代码

接下来,我们使用PHP的DOM解析器来解析目标网站的HTML代码,并获取我们需要的旅游产品信息。在代码中,我们使用了XPath表达式来选择class为“list_mod2”的div,并获取其中的产品名称、价格、评价等信息。

1

2

3

4

5

6

7

8

9

10

11

12

$doc = new DOMDocument();

$doc->loadHTML($html);

$xpath = new DOMXPath($doc);

$list_mod2 = $xpath->query('//*[@class="list_mod2"]'); //选择class"list_mod2"的div

foreach($list_mod2 as $mod){

    $modImg = $xpath->query('a/img/@src', $mod)->item(0)->nodeValue; //获取产品图片URL

    $modTitle = $xpath->query('div/h2/a', $mod)->item(0)->nodeValue; //获取产品名称

    $modContent = $xpath->query('div/div/div/p/@title', $mod)->item(0)->nodeValue; //获取产品简介

    $modPrice = $xpath->query('div/div/span/em', $mod)->item(0)->nodeValue; //获取产品价格

    $modComment = $xpath->query('div/div/div/div/span[1]', $mod)->item(0)->nodeValue; //获取产品评价分数

    $modCommentNum = $xpath->query('div/div/div/div/span[2]', $mod)->item(0)->nodeValue; //获取产品评价人数

}

3.3 存储数据

最后,我们将获取到的旅游产品信息存储到数据库中。在代码中,我们使用了PHP的PDO扩展来连接数据库,并将获取到的产品信息插入到名为“product_info”的数据库表中。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//连接数据库

$dsn = 'mysql:host=localhost;port=3306;dbname=test;charset=utf8';

$username = 'root';

$password = '123456';

$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);

$dbh = new PDO($dsn, $username, $password, $options);

//将获取到的产品信息插入到数据库

$stmt = $dbh->prepare("INSERT INTO product_info(img_url, title, content, price, comment_score, comment_num) VALUES(?, ?, ?, ?, ?, ?)");

$stmt->bindParam(1, $modImg);

$stmt->bindParam(2, $modTitle);

$stmt->bindParam(3, $modContent);

$stmt->bindParam(4, $modPrice);

$stmt->bindParam(5, $modComment);

$stmt->bindParam(6, $modCommentNum);

$stmt->execute();

  1. 总结

使用PHP编写爬虫程序,可以轻松地抓取携程旅游网站的旅游产品信息,并将其存储到数据库中。在实际开发中,我们还可以使用多线程、IP代理等技术来提高爬虫程序的效率和稳定性。然而,需要注意的是,在使用爬虫程序的过程中,应当尊重目标网站的版权和隐私政策,避免侵权和滥用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/37098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android SurfaceFlinger——OpenGL ES基础介绍(十二)

前面的文章我们介绍了 HWC,知道他在 Android 系统中用于硬件加速屏幕合成的一个组件。负责将多个 Surface(包括那些可能通过 OpenGL ES 渲染的内容)合成到一起,并输出到屏幕。HWC 利用底层硬件(如 GPU)来执行合成操作,减少 CPU 的负担,提高效率和电池寿命。 一、概述 …

如何借助 LLM 设计和实现任务型对话 Agent

1 引言 在人工智能的快速发展中&#xff0c;任务型对话 Agent 正成为提升用户体验和工作效率的关键技术。这类系统通过自然语言交互&#xff0c;专注于高效执行特定任务&#xff0c;如预订酒店或查询天气。尽管市场上的开源框架如 Rasa 和 Microsoft Bot Framework 在对话理解…

【笔记】一些PDN建立成功后返回的IP地址情况及日志分析

背景 Protocol满足运营商需求,即便是PDN的通的,也可能因为网络问题导致MMS、热点等业务无法正常工作。(丢包?网络无响应?服务器异常) 或者Protocol跟运营商需求不一致,直接SETUP_DATA_CALL失败了。 一般而言,如果APN Protocol 参数配置不符合运营商要求,在 PDN 建立…

正则表达式结合自定义function使用replace

replace使用正则表达式和function替换 js代码 html代码 场景描述 输入不同数量的人名&#xff0c;根据不同的人数打印不同的描述 代码分析 首先在js代码中使用templates定义了5个模板&#xff0c;通过 var idx Math.min(names.length, 4)根据人数获取对应的模板的索引&…

tqdm库教程 - 进度条可视化利器

tqdm库教程 - 进度条可视化利器 1. 什么是tqdm?2. tqdm的基本用法3. tqdm的高级用法3.1 自定义描述3.2 手动更新进度条3.3 在文件处理中使用tqdm 4. tqdm的其他特性4.1 嵌套进度条4.2 在Jupyter Notebook中使用 5. 总结 1. 什么是tqdm? tqdm是一个Python库,用于在循环或长时…

揭秘多年免费听音乐、直播、影视的自用方案:手机、电视、电脑多平台0成本实现媒体自由(内含相关资源)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 多媒体自由 📒🎧 音乐资源📱安卓平台🍎 苹果平台💻 PC平台🎥 影视资源📱 安卓平台🍎 苹果平台📺 电视盒子💻 PC平台📥 电影下载📺 直播资源📱 手机平台💻 PC平台📺 电视盒子⚓️ 相关链接 ⚓️�…

秋招力扣刷题——数据流的中位数

一、题目要求 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始化 …

ISS检测原理

ISS(Intrinsic Shape Signatures)是由Yu Zhong于2009年提出的一种三维形状描述子,用于描述局部或半局部区域的点云,局部区域可以理解为以一个点云中某点为球心,以一定半径构成的可以包含多个内点的球形区域,半局部则是半个球形区域。ISS可用于不同视角点云的配准、快速姿…

大数据面试题之Spark(4)

目录 RDD的容错 Executor内存分配? Spark的batchsize&#xff0c;怎么解决小文件合并问题? Spark参数(性能)调优 介绍一下Spark怎么基于内存计算的 说下什么是RDD(对RDD的理解)?RDD有哪些特点?说下知道的RDD算子 RDD底层原理 RDD属性 RDD的缓存级别? Spark广播变…

MongoDB笔记02

MongoDB中的数据具有灵活的模式&#xff0c;文档在同一集合&#xff0c;但他们不需要具有相同的字段或结构集合&#xff0c;集合文档中的公共字段可以包含不同类型的数据 MongoDB中的数据具有灵活的模式&#xff0c;与sql数据库不同&#xff0c;sql数据库必须在插入数据之前确…

Nuxt3 的生命周期和钩子函数(六)

title: Nuxt3 的生命周期和钩子函数&#xff08;六&#xff09; date: 2024/6/30 updated: 2024/6/30 author: cmdragon excerpt: 摘要&#xff1a;本文深入解析了Nuxt3框架中的多个核心生命周期钩子和组件注册功能&#xff0c;包括imports:sources、imports:extend、import…

刷代码随想录有感(121):贪心算法——买卖股票的最佳时机III

题干&#xff1a; 代码&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {if (prices.size() < 2) return 0;int buy1 prices[0];int buy2 prices[0];int sell1 0, sell2 0;for (int i 1; i < prices.size(); i) {buy1 min(bu…

LLVM 中的指令调度器及其工作过程

LLVM 中的指令调度器及其工作过程 概述 LLVM 中实现了多种指令调度器&#xff0c;分别作用于后端流程的不同阶段&#xff0c;包括指令选择阶段的指令调度器、寄存器分配前的指令调度器和寄存器分配后的指令调度器 这三类调度器都有llc命令行选项可以控制其使能或禁用 在寄存…

解密Eureka UNKNOWN状态:服务注册的隐形守护者

&#x1f310; 解密Eureka UNKNOWN状态&#xff1a;服务注册的隐形守护者 在微服务架构中&#xff0c;Eureka作为Netflix开源的服务发现框架&#xff0c;扮演着服务注册与发现的核心角色。然而&#xff0c;在Eureka的Dashboard上&#xff0c;我们有时会遇到服务状态显示为UNKN…

dsp入门

安装环境 安装 ccs5.5安装 BIOS-MCSDK 多核软件开发包安装 仿真器驱动 工程创建与导入工程 创建工程 创建工程填信息添加.cmd文件&#xff0c;配置内存编译 导入工程 导入 配置工程 选择properties 环境变量 头文件 库文件 仿真器 添加仿真器 先调出仿真器界面创建仿…

rtthread stm32h743的使用(十二)spi设备fal驱动的使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; fal驱动的使用是建立在sfud驱动之上的&#xff0c;所以我们在上一节使用的工程基础上继续实验。 1.在上一节工程的基础…

SpringCloud Alibaba Seata2.0基础入门与安装

官网地址&#xff1a;https://seata.apache.org/zh-cn/ GitHub下载地址&#xff1a;https://github.com/apache/incubator-seata/releases 本文这里下载的是seata2.0.0版本。 【1】概述 ① Seata是什么 Simple Extensible Autonomous Transaction Architecture&#xff0c…

C++ 设计模式之访问者模式

C 设计模式之访问者模式 简介 1、访问者模式 &#xff08;Visitor&#xff09;是一种行为型设计模式&#xff0c;它表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 使用该模式可以在不修改已有程序结构的前提…

vue3 全局引入 onMounted, reactive, ref 的插件全局引入

webpack 的引入 npm install -D unplugin-auto-import const AutoImport require(unplugin-auto-import/webpack).default;configureWebpack: {devtool: source-map,module: {rules: [{test: /\.mjs$/,include: /node_modules/,type: javascript/auto}],}, plugins: [Aut…

Java对象创建过程

在日常开发中&#xff0c;我们常常需要创建对象&#xff0c;那么通过new关键字创建对象的执行中涉及到哪些流程呢&#xff1f;本文主要围绕这个问题来展开。 类的加载 创建对象时我们常常使用new关键字。如下 ObjectA o new ObjectA();对虚拟机来讲首先需要判断ObjectA类的…