爬蟲實戰:使用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.pswp.cn/web/37098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37098.shtml
英文地址,請注明出處:http://en.pswp.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類的…