采集练习(三) 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);

 

posted @ 2013-03-08 15:52  keygle  阅读(1882)  评论(0编辑  收藏  举报