zoukankan      html  css  js  c++  java
  • 采集练习(三) 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);
  • 相关阅读:
    LeetCode 811. Subdomain Visit Count (子域名访问计数)
    LeetCode 884. Uncommon Words from Two Sentences (两句话中的不常见单词)
    LeetCode 939. Minimum Area Rectangle (最小面积矩形)
    LeetCode 781. Rabbits in Forest (森林中的兔子)
    LeetCode 739. Daily Temperatures (每日温度)
    三种方式实现按钮的点击事件
    239. Sliding Window Maximum
    14.TCP的坚持定时器和保活定时器
    13.TCP的超时与重传
    12.TCP的成块数据流
  • 原文地址:https://www.cnblogs.com/keygle/p/2950106.html
Copyright © 2011-2022 走看看