Guzzle爬取京东数据

1. 下载guzzle

打开链接 php组件下载 搜索Guzzle

packagist.org

点开第一个,复制composer命令
composer require guzzlehttp/guzzle
然后就等他下载,一般很快,慢的话先把composer换成中国镜像
omposer config repo.packagist composer https://packagist.phpcomposer.com
下载完成后会在你的目录中出现vendor目录,打开应该有这三个目录

vendor目录

composer下载会把依赖包也一并下载下来,然后我们回到vendor同级目录,创建一个文件开始写代码

2. 引入类文件,简单请求

    //引入
    require './vendor/autoload.php';
    use GuzzleHttp\Client;
    $client = new Client();
    //GET方式请求链接
    $response = $client->request('GET','http://www.baidu.com');

而后获取该链接返回结果,直接输出

    //获取html代码
    $html = $response->getBody()->getContents();
    echo $html;

可以看到我访问的是我本地的PHP文件,但返回的是百度的页面


2.php

但是要注意,这样返回的结果就是你在该链接右键查看网站源代码所获得的代码,后期用js加载出来的内容你并不能直接获取

3. 获取单个商品信息

好了,既然已经可以获取到网站的代码了,那么我们就只需要把自己需要的内容拿出来就OK了,比如我们随便打开一个京东的商品详情页


京东商品详情

我们按照前面的方式,复制url,获取该链接的html

    $response = $client->request('GET','https://item.jd.com/100000287117.html');
    $html = $response->getBody()->getContents();

现在我们从获取到的结果中用正则匹配出自己所需的内容

比如先获取一个商品名

F12 查看标题内容 复制出自己所需内容,去网页源代码中寻找有特点,容易匹配的区域


京东商品名
源代码筛选

复制该区域内容,去处理正则

  //括号区域是我们所需内容 尖括号内是别名
  $ptn_name = '/<div class="sku-name">(?<name>.*)<\/div>/isU';
  //从$html中匹配出所需内容,放入$res中
  preg_match($ptn_name,$html,$res);
  echo $res['name'];

输出结果,可以看到匹配到了需要的内容,但是乱码,肯定是字符集的问题


乱码商品名

看一下京东的字符集,是GBK,那我们在用函数转成UTF-8

  //转字符集
  echo iconv('GBK','UTF-8',$res['name']);
正常商品名

再获取一个商品图

还按照前面的方法

    $ptn_pic = '#<li  class=\'img-hover\'><img alt=\'.*\' src=\'(?<pic>.*)\'.* width=\'54\'     height=\'54\'></li>#isU';
    preg_match($ptn_pic,$html,$res);
    echo $res['pic'];

看结果

图片获取

获取skuid

    $ptn_sku = '/<a class="follow J-follow" data-id="(?<skuid>.*)" href="#none".*/isU';
    preg_match($ptn_sku,$html,$res);
    echo $res['skuid'];

再获取一个价格

html价格

还按照前面的方式去源代码中查找


空价格

哎?我们发现源代码中的价格,是空,因为价格是后面用JS生成的,所以我们没有办法直接获取,咋办呢?现在我的方法是去页面的加载文件中找长得像生成价格的js文件或者接口,这层页面找不到就去上一层,或者别的地方找


price.js

但是怪麻烦的,我就百度了一下,就找到了这个
各大平台免费api接口(福利)
既然这样那就直接用skuid去获取一下就OK了

     $response_price = json_decode($client->request('GET','http://p.3.cn/prices/mgets?skuIds=J_'.$skuid.'&type=1')->getBody()->getContents());
     echo  $response_price[0]->p;

4. 获取数据

最后获取一下10页的内容,简单存一下

  public function get_data(){
        set_time_limit(0);
        $res = [];
        for($i = 0;$i < 10; $i++){
            $res[] = $this->get_url('https://list.jd.com/list.html?cat=9192,9196,12610&page='.$i.'&sort=sort_totalsales15_desc&trans=1&JL=6_0_0#J_main');
        }
        foreach($res AS $k => $v){
            foreach($v AS $kk => $vv){
                $res = Db::table('guzzle_jd')->insert([
                    'name' => $vv['title'],
                    'price' => $vv['price'],
                    'skuid' => $vv['skuid'],
                    'img' => $vv['pic'],
                    'talk' => $vv['talk'][0]
                ]);
            }
        }
    }

    //获取本页所有商品信息
    private function get_url($url){
        $client = new Client();
        $response = $client->request('GET',$url);
        $html = $response->getBody()->getContents();
        $ptn_url ='#<div class="p-name">.*<a target="_blank" title=".*" href="(?<url>.*)">.*</a>#isU';
        preg_match_all($ptn_url,$html,$res);
        $list = [];
        foreach($res['url'] AS $k => $v){
            $list[] = $this->get_info($v);
        }
        return $list;
    }

    //获取单个商品信息
    private function get_info($url){
        $client = new Client();
        $response = $client->request('GET',$url);

        $html = $response->getBody()->getContents();
        $ptn_name = '/<div class="item ellipsis" title="(?<title>.*)">/isU';
        preg_match($ptn_name,$html,$res);
        $goods['title'] =  iconv('GBK','UTF-8',$res['title']);

        $ptn_sku = '/<a class="follow J-follow" data-id="(?<skuid>.*)" href="#none".*/isU';
        preg_match($ptn_sku,$html,$res);
        $goods['skuid'] = $res['skuid'];

        $ptn_pic = '#<img.*width="350" data-origin="(?<pic>.*)" alt=".*"/>#isU';
        preg_match($ptn_pic,$html,$res);
        $goods['pic'] = $res['pic'];

        $pth_talk = '/<div class="comment-content">(?<talk>.*)<\/div>/isU';
        preg_match_all($pth_talk,$html,$res);
        foreach($res['talk'] as $k => $v){
            $res['talk'][$k] = iconv('GBK','UTF-8',$v);
        }
        $goods['talk'] = $res['talk'];

        $response_price = json_decode($client->request('GET','http://p.3.cn/prices/mgets?skuIds=J_'.$goods['skuid'].'&type=1')->getBody()->getContents());
        echo '<pre>';
        $goods['price'] = $response_price[0]->p;

        return $goods;
    }

于是我就获取了,震动棒~


震动棒

取价格那个玩意不能用了,我再试试换一下Referrer行不行……

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,464评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_x阅读 15,967评论 3 119
  • 想要人们都能在快生活里慢一慢,停下来看一看。 我一直觉得最能感受到年味的活动除了贴春联、粘福字、吃年夜饭、看春晚⋯...
    豆眼儿山雀阅读 347评论 4 4
  • 你知道那种粉白色的细腻肌肤,每一寸都在引诱我。
    暗箱操作者阅读 129评论 0 0
  • A ————创建画布 R———— 创建方块 O(shift)—- 画圆
    孟维学阅读 181评论 0 0