c语言编程笔录

您现在的位置是:首页 > 编程 > 编程经验

编程经验

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

李雅惠 2023-07-09编程经验
携程旅游信息爬取-爬虫技术背景爬虫是一种获取互联网数据的技术手段。它通过模拟浏览器访问网站并解析页面数据,实现大规模、快速、自动化地抓取互联网信息。在PHP中,主要使用CURL、

携程旅游信息爬取-爬虫技术背景

爬虫是一种获取互联网数据的技术手段。它通过模拟浏览器访问网站并解析页面数据,实现大规模、快速、自动化地抓取互联网信息。在PHP中,主要使用CURL、file_get_contents()、Stream等函数库来实现对网站的请求和响应以及解析页面数据。在本次实战中,我们选择使用CURL库来实现携程旅游信息的爬取任务。

//初始化CURL
$ch = curl_init();
//设置请求链接
curl_setopt($ch, CURLOPT_URL, $url);
//设置请求方式
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//执行请求
$result = curl_exec($ch);
//关闭CURL
curl_close($ch);

携程旅游信息爬取-程序设计

首先,我们需要分析携程旅游信息的网页结构,因为我们要通过解析网页结构来获取所需的信息。通常情况下,我们可以使用F12开发者工具查看页面结构,找到存储目标信息的HTML节点及其CSS类名或ID,以便于后续编写解析程序。

//请求链接
$url = 'http://you.ctrip.com/sight/';
//初始化CURL
$ch = curl_init();
//设置请求链接
curl_setopt($ch, CURLOPT_URL, $url);
//设置请求方式
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//执行请求
$result = curl_exec($ch);
//关闭CURL
curl_close($ch);
//创建DOM对象
$dom = new DomDocument();
@$dom->loadHTML($result);
//获取景点列表HTML节点
$ul_list = $dom->getElementById('search_list');
//获取所有景点的HTML节点
$li_list = $ul_list->getElementsByTagName('li');
foreach ($li_list as $li) {
    //获取景点名字
    $name = $li->getElementsByTagName('h3')->item(0)->nodeValue;
    //获取景点评分
    $score = $li->getElementsByTagName('span')->item(0)->nodeValue;
    //获取景点介绍
    $desc = $li->getElementsByTagName('p')->item(3)->nodeValue;
    //输出结果
    echo "景点名字:" . $name . "
"; echo "景点评分:" . $score . "
"; echo "景点介绍:" . $desc . "

"; }

携程旅游信息爬取-反爬策略

在爬虫实现的过程中,可能会遇到反爬机制,比如IP封锁、用户登录、验证码、限制请求速率等。为了应对这些反爬机制,我们需要采取相应的策略。常用的策略包括使用代理IP、模拟用户行为、使用验证码识别工具等。

//定义代理IP池
$ip_list = array(
    'http://127.0.0.1:8080',
    'http://127.0.0.1:8081',
    'http://127.0.0.1:8082',
);
//获取随机代理IP
$ip = $ip_list[array_rand($ip_list)];
//初始化CURL
$ch = curl_init();
//设置请求链接
curl_setopt($ch, CURLOPT_URL, $url);
//设置请求方式
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//设置代理IP
curl_setopt($ch, CURLOPT_PROXY, $ip);
//执行请求
$result = curl_exec($ch);
//关闭CURL
curl_close($ch);

携程旅游信息爬取-数据存储

爬取到的数据需要存储到数据库中或者本地文件系统中,以便后续分析和使用。常用的数据库包括MySQL、MongoDB、Redis等。在本次实战中,我们将数据存储到MySQL数据库中。

//连接数据库
$host = 'localhost';
$username = 'root';
$password = '123456';
$dbname = 'test';
$conn = new mysqli($host, $username, $password, $dbname);
//插入数据
$stmt = $conn->prepare("INSERT INTO sights (name, score, `desc`) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $name, $score, $desc);
foreach ($li_list as $li) {
    //获取景点名字
    $name = $li->getElementsByTagName('h3')->item(0)->nodeValue;
    //获取景点评分
    $score = $li->getElementsByTagName('span')->item(0)->nodeValue;
    //获取景点介绍
    $desc = $li->getElementsByTagName('p')->item(3)->nodeValue;
    //执行插入操作
    $stmt->execute();
}
//关闭数据库连接
$conn->close();

文章评论