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

 

你可能感兴趣的:(PHP)