爬虫实战:用PHP爬取京东商品信息

在当今的电商时代,京东作为中国最大的综合电商之一,每日上架的商品数量甚至可以达到数万种。对于广大的消费者来说,京东提供了广泛的商品选择和优势的价格优惠。但是,有些时候,我们需要批量获取京东商品信息,快速筛选、比较、分析等等。这时候,我们就需要用到爬虫技术了。在本篇文章中,我们将会介绍利用php语言编写爬虫,帮助我们快速爬取京东商品信息的实现。

1.准备工作

首先,我们需要安装php所需的curl扩展,并设置一些常用的变量。具体步骤如下:

首先,打开终端或powershell,输入以下命令来安装curl扩展包:

1

sudo apt-get install php7.0-curl //ubuntu系统安装

1

brew install curl-openssl php-curl //macOS系统安装

接着,我们需要在PHP的代码中设置一些简单的变量,方便我们在后续的代码中使用。比如,我们定义一个$jgname变量表示京东的访问地址,另一个$skulist变量表示每个商品的访问地址。代码如下:

1

2

$jgname= "https://list.jd.com/list.html?cat=1318,1486,1490&ev=exbrand_13910&sort=sort_rank_asc&trans=1&JL=3_%E5%93%81%E7%89%8C_%E5%B0%8F%E7%B1%B3%EF%BC%88MI%EF%BC%89#J_crumbsBar";

$skulist="https://item.jd.com/1285310.html";

2.获取商品列表

现在我们已经准备完了环境和需要的变量,我们可以开始编写我们的爬虫了。首先,我们需要获取目标京东商品页面的商品列表。我们可以根据,京东商品页的访问地址(即$jgname),利用curl的工具和正则表达式来获取目标链接。分别获取价格、评论数、商品名称、商品编号等等商品信息。

具体代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

$ch = curl_init();//初始化curl

curl_setopt($ch, CURLOPT_URL,$jgname);//设置url属性

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//设置是否将curl_exec()获取的信息以字符串返回,而不是直接输出

$result = curl_exec ($ch);//执行一个curl会话

curl_close ($ch);//关闭curl会话

preg_match_all("/<li .*?</li>/", $result, $matches);//正则表达式把需要的内容取出来,即匹配<li>标签

$goodsinfo=array();//创建一个商品列表

foreach ($matches[0] as $item) {

    //获取商品信息

    preg_match("/sku="(d+)"/",$item,$skuid);

    preg_match("/标题">s{0,}([dD]+?)s{0,}</a>/",$item,$titlename);

    preg_match("/<strong>¥</strong>[s

]{0,}<i>(d+.d+)</i>/",$item,$price);

    preg_match("/<divs{0,}class="p-commit">[s

]+<strong[^>]+>(d+)/",$item,$commentnum);

    preg_match("/<as{0,}href="([dD]+?)"/",$item,$link);

    //将商品信息存储到商品列表中

    $goods=array(

         "title"=>trim($titlename[1]),

         "price"=>trim($price[1]),

         "link"=>"https:".$link[1],

         "skuid"=>trim($skuid[1]),

         "commentnum"=>trim($commentnum[1])

    );

    array_push($goodsinfo,$goods);//将商品信息添加到商品列表

    //输出测试:打印商品信息

    echo $goods['title']." ".$goods['price']." ".$goods['commentnum']." ".$goods['link']."<br>";

}

在以上代码中,我们将获取到的每个商品的链接和编号存储在了$goods‘skuid’和‘link’中,并将其它有用的信息(价格,评论数等)放入$goods数组中。最后,经由array_push()函数添加至$goodsinfo数组中。你可以使用循环语句来输出商品列表信息,便于查看爬取结果。

3.获取商品详细信息

现在,我们已经获取到了京东商品表页中的商品列表信息,接下来的步骤就是获取每个商品的详细信息,并将其存储在$goods数组中。我们在上一步的$goods数组中已经获取了每个商品的编号和链接。因此,接下来的操作就是打开每个链接,获取各种有用的商品信息。具体代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

foreach ($goodsinfo as &$goods) {

    //更新每个商品的网页链接

    $link="https://item.jd.com/".$goods['skuid'].".html";

    $goods['link']=$link;

    $canBuy=true;//官网上可以买

    //判断是否能够购买

    preg_match('/无货/',file_get_contents($link)) && ($canBuy=false);

    //利用curl工具打开网页链接,获得网页代码

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL,$link);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

    $html = curl_exec ($ch);

    curl_close ($ch);

    //分析网页代码,使用正则表达式获取商品种类,价格,颜色,库存数量等数据,并保存

    preg_match_all('/<divs{0,}class="Ptable".*?>[s

]+<divs{0,}class="Ptable-item".*?>[s

]+([dD]*?)</div>/',$html,$items);

    preg_match_all('/<strong>商品名称</strong><em>(d.*)</em>/',$html,$item);

    $goods['title']=$item[1][0];

    echo $goods['title'];

    if($canBuy)

    {

        foreach ($items[1] as &$item) {

            //去掉html标记、空格、换行符

            $item=strip_tags($item);

            $item=str_replace(" ","",$item);

            $item=str_replace("    ","",$item);

            $item=str_replace("

","",$item);

            $item=str_replace("

","",$item);

            //切割字符串,获取键值对

            preg_match_all('/([dD]*?):([dD]*?)[

]/',$item,$item2);

            if(count($item2[1])>0){

                for($i=0;$i<count($item2[1]);$i++){

                    if($item2[1][$i]=="价格"){

                        $goods['price']=$item2[2][$i];

                    }elseif($item2[1][$i]=="颜色"){

                        $goods['color']=$item2[2][$i];

                    }elseif($item2[1][$i]=="产地"){

                        $goods['producePlace']=$item2[2][$i];

                    }elseif($item2[1][$i]=="商品编号"){

                        $goods['goodsn']=$item2[2][$i];

                    }elseif($item2[1][$i]=="型号"){

                        $goods['model']=$item2[2][$i];

                    }elseif($item2[1][$i]=="商品毛重"){

                        $goods['grossWeight']=$item2[2][$i];

                    }elseif($item2[1][$i]=="规格"){

                        $goods['specifications']=$item2[2][$i];

                    }

                }

            }

        }

        //获取商品评论数

        preg_match_all('/<as{0,}href="#comment"s{0,}target="_self">s{0,}[dD]+?<strongs{0,}class="curr-num">(d*)</',$html,$comment);

        $goods['commentnum']=$comment[1][0];

    }

}

在这些代码中,我们使用了类似于第2步的技术,利用curl工具获得每个商品的详细链接,然后利用正则表达式来获取一些有用的商品信息。我们可以通过如下方式来输出获取到的商品详细信息:

1

2

3

foreach ($goodsinfo as &$goods) {

    echo $goods['skuid']." ".$goods['title']." ".$goods['price']." ".$goods['commentnum']." ".$goods['link']."<br>";

}

整个流程就这些了。在实际应用中,我们可以根据实际的需求对代码进行一些调整和优化,如添加异常处理、设置请求头、调整爬取速度等。总之,在此基础上,可以构建一个稳定、高效的爬虫,获得京东商品信息,进一步助力电商运营和分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值