• 采集练习(三) php 采集当当网图书的数据(初版)


      闲来无事,刚好有这个需求。于是就练一下采集。。

    采集当当网的图书信息。。

    开始考虑 直接采集 当当网的电脑版(www.dangdang.com)但分析了下 估计正则有点难写。于是灵机一动,现在都是移动互联网时代了,肯定采当当网的 移动版网页 (m.dangdang.com) 简单 正则又好写  而且很有可能数据直接在返回的json上直接解析就行(淘宝网的移动版就是这样); 但打开当当网一分析 还是苦b的正则,而且 直到我写完了程序才知道 移动版当当网的人性化 只能翻6页 坑爹呀。。。

    搜索 某出版社    请求的链接:

    http://m.dangdang.com/gw_search.php?key=%E6%9C%BA%E6%A2%B0%E5%B7%A5%E4%B8%9A%E5%87%BA%E7%89%88%E7%A4%BE&cat=01.00.00.00.00.00

    &st=pub&show_type=pic&sid=2df46f9d4ecc2d79

    参数分析

    key =  urlencode 编码过的某出版社

    sid = 认证id  (不要也行)

    cat = 分类  (01.00.00.00.00.00是图书)

    其他参数没什么分析的 直接默认就行  不过可以自己带一个 page   但只能是1到6。。

    遇到的问题:

    1、坑爹的只能采6页 30本书    电脑的看了下 能采99页

    2、正则过多 采集特别慢  file_get_contents 在这里表现老打不开   估计用curl 采集会好点

    3、发现 当当网的图片 同一张图片有好几个大小不一的尺寸 如  sss_a.jpg  sss_b.jpg  sss_l.jpg  sss_e.jpg  sss_m.jpg  sss_s.jpg sss_f.jpg

     下面就是代码了:

    <?php
     /**
      * Created by JetBrains PhpStorm.
      * User: keygle
      * Date: 13-3-8
      * Time: 上午10:10
      * To change this template use File | Settings | File Templates.
      */
     
     /**
      * 返回打开url后得到的内容
      * @param $url  需要打开的url
      * @return string
      */
     function getData($url)
     {
         $opts = array(
             'http' => array(
                 "timeout" => 10,
                 "method" => "GET",
                 "header" => "User-Agent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7\r\n" .
                             "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" .
                             "Connection: keep-alive\r\n\r\n"
             )
         );
         $content = stream_context_create($opts);
         return @file_get_contents($url,FALSE,$content);
     }
     
     $key = urlencode('中国少年儿童出版社');
     $cat = '01.00.00.00.00.00'; //图书分类
     $page = 20;
     set_time_limit(0);
     $books = array();
     for ($i = 1; $i <= $page; $i++) {
         $url = "http://m.dangdang.com/gw_search.php?key=" . $key . "&cat=" . $cat."&page=".$i;
         $html = getData($url);
         preg_match_all('#<span class="prouct_name"><a href="([^"]+)"#iUs', $html, $urls);
         $bookUrls = $urls[1];
         if (is_array($bookUrls)) {
             foreach ($bookUrls as $val) {
                 $book = array();
                 $bookUrl = "http://m.dangdang.com/" . $val;
                 $urlInfo = parse_url($bookUrl);
                 $querys = explode('&', $urlInfo['query']); // $query = array('pid=20747626','sid=2bce9c29ecc1ea79','recoref=search')
                 $bookIntro = getData($bookUrl); // 图书页
                 //图书详情页url http://m.dangdang.com/product.php?pid=20747626&ac=more&cat=book
                 $bookIntroUrl = "http://m.dangdang.com/product.php?" . $querys[0] . "&ac=more&cat=book&" . $querys[1];
                 $bookContentUrl = "http://m.dangdang.com/product.php?" . $querys[0] . "&ac=content&cat=book&" . $querys[1]; // 图书内容简介
                 $bookContent = getData($bookContentUrl);
                 $bookHtml = getData($bookIntroUrl);
                 preg_match("#简介<\/strong>([^<]+)<div>([^<]+)<\/div>#iUs", $bookContent, $content);
                 preg_match('/<img src="(http:\/\/img[^"]+)"/iUs', $bookIntro, $image); //获取图书图片
                 preg_match("/<title>([\d\D]+)?-图书-手机当当网<\/title>/iUs", $bookHtml, $bookName);
                 preg_match("/作者:([^<]+)?<\/p>/iUs", $bookHtml, $author);
                 preg_match("/出版社: <a([^>]+)>(.*)?<\/a><\/p>/iUs", $bookHtml, $press);
                 preg_match("/出版时间:([^<]+)<\/p>/iUs", $bookHtml, $pubtime);
                 preg_match("/ISBN:([^<]+)<\/p>/iUs", $bookHtml, $isbn);
                 preg_match("/包装:([^<]+)<\/p>/iUs", $bookHtml, $pack);
                 preg_match("/页数:([^<]+)<\/p>/iUs", $bookHtml, $pages);
                 preg_match("/定价: <span([^>]+)>(.*)?<\/span>/iUs", $bookHtml, $price);
                 preg_match("/当当价: <span([^>]+)>(.*)?<\/span><\/p>/iUs", $bookHtml, $dd_price);
                 preg_match("/当当价: <span([^>]+)>(.*)?<\/span><\/p>/iUs", $bookHtml, $dd_price);
                 preg_match("/节省:([^<]+)?<\/p>/iUs", $bookHtml, $save);66             $book['content'] = trim($content[2]);
                 $book['image'] = $image[1];
                 $book['name'] = $bookName[1];
                 $book['author'] = $author[1];
                 $book['press'] = $press[2];
                 $book['pubtime'] = $pubtime[1];
                 $book['isbn'] = $isbn[1];
                 $book['pack'] = $pack[1];
                 $book['pages'] = $pages[1];
                 $book['price'] = $price[2];
                 $book['price'] = $dd_price[2];
                 $book['save'] = $save[1];
                 $books[] = $book;
             }
         }
     }
     echo '<pre>';
     print_r($books);
  • 相关阅读:
    2-Requests库的使用
    1-urllib库的使用
    (一)数据结构-基本数学知识
    maven配置阿里云仓库
    mac安装homebrew
    创建简单spring boot项目
    Java反射
    Python3 去除空格
    Spot 安装和使用
    安装LLVM
  • 原文地址:https://www.cnblogs.com/keygle/p/2950106.html
Copyright © 2020-2023  润新知