抓取内容分析
抓取页面:http://www.zzguifan.com/webarbs/book/117/2916303.shtml
是一个规范文件的在线查看网站,可以单页查看,但没有提供下载方法。右键图片发现是明文链接,遂考虑使用代码批量抓取。
分析页面结构,左侧为文档页数,右侧为文档图片。
由于左侧显示了所有的页面链接,查看链接名称后发现链接是按数字顺序排序的,从2916303至2916606,共304个页面。在知道了页面链接的规律之后,就可以直接构造抓取链接。
1 2 3 4 5 6 7 8 |
// Set URL $url_base = 'http://www.zzguifan.com/webarbs/book/117/'; $url_start = 2916303; $url_end = 2916606; for ($i = $url_start; $i <= $url_end; $i++) { $dom_url = $url_base.$i.'.shtml'; // do something } |
而右侧的图片包括在了一个Div中,Div的Class参数为book_content,通过在Div中查找img标签,可以直接获得图片url。
1 |
$imgUrl = $dom->find('div[class=book_content]',0)->find('img',0)->src; |
通过模拟抓取页面,发现网站并没有采用防抓取技术,图片也是明文链接,可以直接从外部下载服务器端资源。
构造代码
使用组件:Sunra\PhpSimple\HtmlDomParser
主要部分
抓取代码的主要部分是一个for循环,遍历需要抓取的页面地址,获取img的src地址,然后通过curl下载到本地。
其中,考虑到中断后的再次运行,添加了对下载文件的判断,如果已下载完成,就直接跳过抓取步骤。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// Set URL $url_base = 'http://www.zzguifan.com/webarbs/book/117/'; $url_start = 2916303; $url_end = 2916606; // $url_end = 2916305; for ($i = $url_start; $i <= $url_end; $i++) { echo $i; echo '<br>'; // Save image to file $img_fileName = $i.'.jpg'; $img_filePath = "/var/www/get-info/gb50243/".$img_fileName; if (file_exists($img_filePath) && filesize($img_filePath)!=0) { echo "The file $img_fileName exists"; echo '<br>'; } else { echo "The file $img_fileName does not exist"; echo '<br>'; // get img content $dom_url = $url_base.$i.'.shtml'; echo $dom_url; echo '<br>'; $dom = HtmlDomParser::file_get_html($dom_url); $imgUrl = $dom->find('div[class=book_content]',0)->find('img',0)->src; echo $imgUrl; echo '<br>'; // download images to local $url = $imgUrl; $image = curl_get_redirects($url,$refer); $fp = fopen($img_filePath, 'w'); fwrite($fp, $image); fclose($fp); echo "All Done! The fileUrl is:".$img_filePath; echo '<br>'; } } |
总结
存在问题:网页端运行后,需要1-2秒才能下载一页内容,所以303页需要至少600秒,严重的超过了PHP的运行时限,所以代码中端后,需要多次刷新页面重新运行,也可以在浏览器端使用定时刷新插件,5分钟刷新一次,15分钟左右,可以下载完成303页文件。
There are no comments yet