Lofter爬虫

这两天对LOFTER上面的几个妹子情有独钟,然而她们每一个都是自拍狂魔,手动收藏她们的照片实在是太慢了,于是我就写了一个爬虫专门去收集她们的照片了。
使用方法非常简单,只要输入Lofter ID就可以爬取到妹子(当然也可以是汉子)的所有照片了。爬取之后的图片存放在主机中。
本来我把地址po出来了,但是居然有人恶意攻击,所以暂时不公开成品地址了。
下面说一下爬虫的大体思路,我自然不会去闲的没事干去抓取app的请求相应包(事实上我确实这么做了,但是效果不理想)。Lofter web版 给我们提供了一个天然的爬虫环境,我们就拿它下手吧。

仔细观察一下,所有lofter blog 的url都是这个格式的:{ID}.lofter.com。之后再仔细观察一下,我们就可以发现一个好东西,他是长这个样子的:{ID}.lofter.com/view。
这个界面为之后的工作提供了得天独厚的环境。虽然这个界面是JS生成的,用普通的爬虫爬取不到,不过我们可以使用Selenium配合Phantomjs动态渲染出整个界面啊,啦啦~
拿到Page Source之后,剩下的事情就好办了。我在这里使用了BeautifulSoup4进行html的标签解析,成功的利用class拿到了所有图片的url地址。
为了提高效率,我并没有同步地下载图像,而是将所有的url先压入了一个栈中。等待所有url获取完毕之后,开了一个进程池去逐条下载图片。其实这里确实是可以解析页面和下载图片同时进行的,但是所能优化的时间非常有限,所以并没有这样去做。
最后我希望可以方便的使用这个工具,而不是只在有终端连接的情况下。于是我给主机装上了lamp环境,由php去调用爬虫。这样我就可以随时随地的看到我想要的内容了。
通常如果你没有配置过apache的权限的话,你会在error_log里发现permission denied。这是因为apache并没有root的权限去执行相关的操作。于是乎,你需要这样做去解决下面的问题。

$ lsof -i:80
COMMAND   PID      USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
httpd   22017      root    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22019    apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22020    apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22021    apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22022    apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22023    apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22026    apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   24262    apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)

首先确定自己apache( httpd )服务的临时USER,就是标红的那个。之后建立一个新的USER,去httpd.conf修改一下apache的执行用户:

$ useradd my_apache
$ lsof -i:80
COMMAND   PID      USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
httpd   22017      root    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22019 my_apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22020 my_apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22021 my_apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22022 my_apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22023 my_apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   22026 my_apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)
httpd   24262 my_apache    3u  IPv4 1517901      0t0  TCP *:http (LISTEN)

之后使用visudo编辑/etc/sudoers,当然用vi也可以。但visudo可以在退出的时候进行语法检查,保证你的文件可以正常运行。第一步,找到Defaults requiretty,然后把它注释掉:

#Defaults requiretty

第二步,找到这段,添加最下面的一行,使php可以无需密码调用sudo:

## Allow root to run any commands anywhere
root            ALL=(ALL)       ALL
my_apache       ALL=(ALL)       NOPASSWD:ALL

现在重启apache服务(service httpd restart),就可以使用php调用py脚本啦。


最后总结一下,php这块的处理确实还不是很好,sudo的权限暴露很有可能导致php注入攻击(各位大神手下留情,那台机器里面就只有这一个服务)。另外php的回显需要等到脚本执行完毕这一点也非常令人不爽,之后有空我会把它改成异步的。至于反反爬虫之类的手段,我目前还没有遇到什么太大的问题。
之前爬取煎蛋网的时候,遇到了超载鸡的拦截,加了高匿代理丝毫没有起到作用。后来无意中加上了user-agant,居然放行了!被超载鸡的蠢萌惊呆了,放上超载鸡大人真身镇楼。