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