向阳乔木
首发于向阳乔木
更新:2行代码下载4万张美女图,让你看到吐~(宅男福利)

更新:2行代码下载4万张美女图,让你看到吐~(宅男福利)

1月10日更新,评论里有高手,孙绍忠教授用了更短的行搞定,代码简洁高效。看来标题可以改成4行代码下载4万张美女图。(其实算2行)

<?php
for ($pageno = 1 ; $pageno < 1848; $pageno ++) {
preg_replace_callback('/class=\"joke-main-img\" src=\"(.*?)\"/',function($matches){copy(str_replace('small', 'big',$matches[1]),'s/'.basename($matches[1]));},file_get_contents('haha.mx/topic/1/new/'.$pageno));}

这很强势:)
--------------------------------------------------------------------------------------------
今天在知乎偶然看到一篇“使用Nodejs百行代码爬取美女图”的教程,不少朋友点赞和打赏,刚需就是不一样。

百行代码的爬虫爬取美女图

我也试了下,刚好20行PHP代码就可以搞定。

运行后成果如下(前方高能乎?)

怎么做到20行代码?

因为使用了owner888大神的phpspider采集框架。

如果能科学上网访问Github的同学,赶快Star这个开源项目,大神写这个框架是为了证明“PHP是世界上最好的语言”,据说这句会引起编程界的血雨腥风…

科学上网有障碍,访问这里下载:
Coding | 代码托管,项目管理,WebIDE,演示部署,开启云端开发模式,让开发更简单

手把手教你采集美女图

苹果笔记本系统自带PHP,如果你用Windows,也有很多一键安装包。

点击下载一键安装包XAMPP

当有PHP开发环境后,解压大神的PHP框架到任意地方,大概有这么几个文件夹。

其中projects是自己建的,以后代码都放这里。

然后新建一个php文件名字为hahamx.php,再建一个images文件夹用来存放图片。

Windows下使用 Win+R 快捷键打开命令提示行,通过cd 目录命令最终进入我们的projects文件夹,输入 php hahamx.php运行,然后你就会在images文件夹看到美女图了。

同理,Mac下使用Terminal终端运行PHP文件即可。

解释hahamax.php每行的意思:

// 给PHP设置内存占用,这里为1个G也就是1024M
ini_set("memory_limit", "1024M");

// 引用PHPspider框架的核心文件。
// 因为我们代码放在projects目录下,所以使用相对路径。
// dirname(__FILE__)指的是本文件所在文件夹,'/../'指的是上级目录。
// 这句翻译过来就是,引用文件所在文件夹上级目录core中的init.php文件。

require dirname(__FILE__)."/../core/init.php";

// 写一个方法来保存图片,参数$url是含有图片页面的网址。
function saveImages($url){
    // requests::get($url) 是框架的静态方法。
    // 通过网址获取页面的HTML代码。
    $html = requests::get($url);

    // Xpath规则:获取Class样式为joke-main-img的图片地址。
    $selector = '//img[@class="joke-main-img"]/@src';
    // 使用上面的Xpath规则去找匹配,返回数组。
    $imgs = selector::select($html, $selector);

    // 循环图片数组
    foreach ($imgs as $key => $value) {
    // 把图片地址中的small换成big,这样就是大图的真实地址
        $imgUrl = str_replace('small', 'big', $value);
        // PHP自带函数parse_url,解析网址返回数组
        $arr = parse_url($imgUrl);
        // 返回URL路径中的文件名部分
       $file = basename($arr['path']);
       // 采集图片
        $image = file_get_contents($imgUrl); 
        // 写图片到本地images文件夹,文件名与原图片名相同。
        file_put_contents('images/'.$file, $image);
    }
}

// 美女福利频道一共有1845个分页,For循环拼出待采集的页面地址。
for ($i=1; $i < 1846; $i++) { 
    $url = '[http://www.haha.mx/topic/1/new/](http://www.haha.mx/topic/1/new/)'.$i;
    // 传URL执行上面写的保存图片方法
    saveImages($url);
}

大家请注意

上面写法并不是phpspider的正确用法,有点杀鸡用牛刀的感觉。

phpspider只需要简单配置好入口页面规则,采集字段规则,就可以实现自动发现页面分析、采集、存csv文件或存数据库,甚至安装redis后可以支持多线程采集、断点续采。

它还支持正则、Xpath等多种HTML代码匹配采集功能,还有编码转换、各种浏览器模拟、代理IP设置等高级功能。

感兴趣的朋友加我微信vista8,多多交流。

PHPspider学习交流QQ群:147824717


编辑于 2017-01-10

文章被以下专栏收录