巧用简单工具:PHP使用simple_html_dom库助你轻松爬取JD.com

2023-11-30 16:45:16 浏览数 (3)

概述

爬虫技术是一种从网页上自动提取数据的方法,它可以用于各种目的,比如数据分析、网站监控、竞争情报等。爬虫技术的难度和复杂度取决于目标网站的结构和反爬策略,有些网站可能需要使用复杂的工具和技巧才能成功爬取,而有些网站则相对简单,只需要使用一些基本的工具和库就可以实现。

本文将介绍如何使用PHP语言和一个简单的第三方库simple_html_dom来爬取JD.com的商品信息。simple_html_dom是一个轻量级的HTML解析器,它可以方便地从HTML文档中提取元素和属性,而无需使用正则表达式或DOM操作。本文将通过一个实例来展示如何使用simple_html_dom库来爬取JD.com的商品名称、价格、评分和评论数,并将结果保存到CSV文件中。本文还将介绍如何使用代理IP技术来避免被目标网站封禁或限制。

正文

1. 安装和引入simple_html_dom库

要使用simple_html_dom库,首先需要下载它的源码文件,可以从这里获取。下载后,将simple_html_dom.php文件放到你的项目目录下,然后在你的PHP代码中引入它,如下所示:

代码语言:php复制
<?php
// 引入simple_html_dom库
require_once 'simple_html_dom.php';

2. 定义目标URL和代理IP

接下来,我们需要定义我们要爬取的目标URL和代理IP。在本例中,我们将爬取JD.com的手机分类下的第一页的商品信息。我们还需要使用代理IP来伪装我们的请求,以防止被目标网站识别和封禁。我们可以从爬虫代理获取高质量的代理IP,它提供了多种类型和地区的代理IP,以及不同的认证方式。在本例中,我们将使用HTTP协议的爬虫加强版代理,其域名为proxy.16yun.cn,端口为8080,用户名和密码为你在爬虫代理注册后获得的。我们将这些信息定义为变量,如下所示:

代码语言:php复制
<?php
// 定义目标URL
$url = 'https://list.jd.com/list.html?cat=9987,653,655';

// 亿牛云 爬虫加强版代理 定义代理IP的域名、端口、用户名和密码
$proxy_host = 'proxy.yiniuyun.com';
$proxy_port = '8080';
$proxy_user = '16YUN';
$proxy_pass = '16IP';

3. 发送请求和获取响应

然后,我们需要使用PHP的curl扩展来发送请求和获取响应。curl是一个强大的网络传输工具,它支持多种协议和选项,可以用于模拟浏览器的行为。我们需要设置一些curl的选项,比如设置代理IP、设置超时时间、设置用户代理等,以保证请求的成功和安全。我们还需要使用simple_html_dom的函数file_get_html来将响应的内容转换为一个simple_html_dom对象,以便后续的解析。我们的代码如下:

代码语言:php复制
<?php
// 初始化curl
$ch = curl_init();

// 设置curl的选项
curl_setopt($ch, CURLOPT_URL, $url); // 设置目标URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置返回结果而不是直接输出
curl_setopt($ch, CURLOPT_PROXY, $proxy_host); // 设置代理IP的域名
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy_port); // 设置代理IP的端口
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy_user . ':' . $proxy_pass); // 设置代理IP的用户名和密码
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置超时时间为10秒
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'); // 设置用户代理为Chrome浏览器

// 发送请求并获取响应
$response = curl_exec($ch);

// 关闭curl
curl_close($ch);

// 将响应的内容转换为一个simple_html_dom对象
$html = file_get_html($response);

4. 解析和提取数据

接下来,我们需要使用simple_html_dom的方法来解析和提取数据。simple_html_dom提供了多种方法来查找和操作HTML元素,比如find、children、first_child、last_child、next_sibling、prev_sibling、parent、innertext、outertext、plaintext、attr等。我们可以使用这些方法来根据HTML元素的标签、类名、ID、属性等来定位和获取我们需要的数据。在本例中,我们需要提取商品的名称、价格、评分和评论数,它们分别对应于HTML元素的以下特征:

  • 商品名称:class为p-name的div元素的第一个子元素的title属性
  • 商品价格:class为p-price的div元素的第一个子元素的innertext
  • 商品评分:class为p-commit的div元素的第一个子元素的第一个子元素的innertext
  • 商品评论数:class为p-commit的div元素的第一个子元素的第二个子元素的innertext

我们可以使用simple_html_dom的find方法来查找所有符合条件的元素,然后遍历它们,使用其他方法来获取它们的数据,并将数据保存到一个数组中。我们的代码如下:

代码语言:php复制
<?php
// 定义一个空数组来存储数据
$data = array();

// 查找所有class为gl-item的li元素,它们是商品的容器
$items = $html->find('li.gl-item');

// 遍历每个商品
foreach ($items as $item) {
    // 定义一个空数组来存储单个商品的数据
    $row = array();

    // 查找商品名称,并将其保存到$row数组中
    $name = $item->find('div.p-name', 0)->first_child()->attr['title'];
    $row['name'] = $name;

    // 查找商品价格,并将其保存到$row数组中
    $price = $item->find('div.p-price', 0)->first_child()->innertext;
    $row['price'] = $price;

    // 查找商品评分,并将其保存到$row数组中
    $rating = $item->find('div.p-commit', 0)->first_child()->first_child()->innertext;
    $row['rating'] = $rating;

    // 查找商品评论数,并将其保存到$row数组中
    $comment = $item->find('div.p-commit', 0)->first_child()->last_child()->innertext;
    $row['comment'] = $comment;

    // 将$row数组添加到$data数组中
    $data[] = $row;
}

5. 保存和输出数据

最后,我们需要将提取的数据保存到CSV文件中,并输出到屏幕上。我们可以使用PHP的fopen、fputcsv、fclose等函数来操作文件,以及print_r函数来打印数组。我们的代码如下:

代码语言:php复制
<?php
// 定义CSV文件的名称
$filename = 'jd.csv';

// 打开CSV文件,如果不存在则创建
$file = fopen($filename, 'w');

// 遍历$data数组
foreach ($data as $row) {
    // 将每行数据写入CSV文件
    fputcsv($file, $row);
}

// 关闭CSV文件

结语

本文介绍了如何使用PHP语言和一个简单的第三方库simple_html_dom来爬取JD.com的商品信息,并将结果保存到CSV文件中。本文还介绍了如何使用代理IP技术来避免被目标网站封禁或限制。通过本文的实例,我们可以看到,使用simple_html_dom库可以方便地从HTML文档中提取元素和属性,而无需使用正则表达式或DOM操作。使用代理IP技术可以增加爬虫的稳定性和安全性,以应对目标网站的反爬策略。本文的代码仅供参考,你可以根据自己的需求和目标网站的特点进行修改和优化,以实现更高效和更强大的爬虫功能。希望本文对你的爬虫技术有所帮助,谢谢阅读。

0 人点赞