flash网站模板免费下载站长工具站长之家
最新跟新:由于叔叔不约规则修改,图片接口在很短时间就无法访问。404结果,本文章介绍的爬虫失效
在一天无聊刷贴吧的时候,偶然发现了一个叫做叔叔不约的匿名聊天网站,好奇的搜索并进入,发现该网站并不需要注册便可以随机匹配聊天对象。开始我以为聊天对象均为AI,然后测试了一波,发现可能并不是AI。经过多次测试,不同的人有不同的说话方式,不像AI作风。
后来我发现这个网站居然可以发图片,而且图片的地址是可以获取到的,双击点击图片便跳转到了http://7xpsm9.com1.z0.glb.clouddn.com/f十二位数字?imageslim的网址上。菜鸡的我本着测试的原则,写了个爬虫来尝试直接获取自己刚才发送的图片,python代码如下:
def pachong(num):try:url = "http://7xpsm9.com1.z0.glb.clouddn.com/f" + num + "?imageslim"response = requests.get(url)image = Image.open(BytesIO(response.content))if(image!=None):#image.save('Z:/img/'+num+'.jpg') #windowsimage.save('/home/img/'+num+'.jpg') #linuxexcept IOError:print "Error: fail"else:print "yes!!!yes!!!yesss"
num传递的就是自己发送图片的数字,代码大概的意思就是用get请求的方式去向服务器索要图片,如果得到了图片那么image就不会为空,则将图片保存下来。要测试的小伙伴们可以试试:1342894147847
接下来,我又连续发了多张测试图片。发现12位数字并没有什么规律可言。最后右键保存网页,看了一波前端代码,有这么一段:
var n = "f" + Math.round((new Date).getTime() * Math.random());
所以图片的地址是大概由用时间戳*随机数得到的一组随机数
于是本着更无聊的玩法,我继续写了个随机函数,随机出12位数字,给让爬虫函数不停的向服务器获取图片。
def suiji():seed = "1234567890"sa = []for i in range(12):sa.append(random.choice(seed))salt = ''.join(sa)print saltreturn salt
结果可想而知,在服务器上爬虫跑了24小时,一张图片也没有获取到。我又测试了java运行相同功能,对比了运行100次python和java的速度,java大概比python快了10% 左右。java代码如下:
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.AllPermission;
import java.util.Random;
public class pachong {public static void main(String[] args) throws Exception {all();}public static void all() throws Exception {int i=0;while (true) {i++;pachong(createData(12));System.out.println(i);}}//根据指定长度生成纯数字的随机数public static String createData(int length) {StringBuilder sb=new StringBuilder();Random rand=new Random();for(int i=0;i<length;i++){sb.append(rand.nextInt(10));}String data=sb.toString();System.out.println(data);return data;}public static void pachong(String num) throws Exception {//new一个URL对象 URL url = new URL("http://7xpsm9.com1.z0.glb.clouddn.com/f"+num+"?imageslim"); //打开链接 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置请求方式为"GET" conn.setRequestMethod("GET"); //超时响应时间为5秒 conn.setConnectTimeout(5 * 1000); //通过输入流获取图片数据 try {InputStream inStream = conn.getInputStream(); if(inStream!=null) {//得到图片的二进制数据,以二进制封装得到数据,具有通用性 byte[] data = readInputStream(inStream); //new一个文件对象用来保存图片,默认保存当前工程根目录 File imageFile = new File(num+".jpg"); //创建输出流 FileOutputStream outStream = new FileOutputStream(imageFile); //写入数据 outStream.write(data); //关闭输出流 outStream.close(); }} catch (Exception e) {System.out.println("没图");}}public static byte[] readInputStream(InputStream inStream) throws Exception{ ByteArrayOutputStream outStream = new ByteArrayOutputStream(); //创建一个Buffer字符串 byte[] buffer = new byte[1024]; //每次读取的字符串长度,如果为-1,代表全部读取完毕 int len = 0; //使用一个输入流从buffer里把数据读取出来 while( (len=inStream.read(buffer)) != -1 ){ //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 outStream.write(buffer, 0, len); } //关闭输入流 inStream.close(); //把outStream里的数据写入内存 return outStream.toByteArray(); } }
java和python都没有把带宽吃完,这是不能忍的,本着一条路走到底的原则,继续使用python来爬。服务器使用centos7+ 系统,其中华为云的centos7.3死活装不进去PIL,换centos7.2后安装正常。后台运行python并且保留输出结果的命令为nohup python 文件名.py & 输出会保留在nohup.out文件中,带宽吃不满没关系,在不同的路径下多运行几个爬虫就行了。使用 top 命令可以看服务器资源占用情况。如果用的是阿里云或者腾讯云可以在网页的控制台查看带宽占用,但是华为没有,那就自己装一个,安装使用如 http://www.osyunwei.com/archives/1211.html 所示。
在本人的测试中,发现1和7开头的12位数字居多,于是采用每次加一的方式去爬图片,得到图片的速度明显比之前的随缘算法来的快。其实也就一天几张图,对叔叔不约储存图片的七牛云这样规模连续的访问并没有遭到限速之类的限制,依然能够顺利的得到图片,但是每个服务器每天的流量是却都有几个G,活脱脱像流量攻击。
12位随机数的接口对于一般人的加密来说是足够,但是对于图片一直在增加的匿名聊天网站可能是完全不够的。我无法获取某一个人聊天的图片,但是能随机获取。在得到的图片中有很多少儿不宜的图片
以下为漂亮小姐姐及风景系列,福利没有。真的没有
# -*- coding: utf-8 -*-import requests
from PIL import Image
from io import BytesIO
import randomdef pachong(num):try:url = "http://7xpsm9.com1.z0.glb.clouddn.com/f" + num + "?imageslim"response = requests.get(url)image = Image.open(BytesIO(response.content))#print imageif(image!=None):#image.save('Z:/img/'+num+'.jpg') #windowsimage.save('/home/img/'+num+'.jpg') #linuxexcept IOError:print "Error: fail"else:print "yes!!!yes!!!yesss"def suiji():seed = "1234567890"sa = []for i in range(12):sa.append(random.choice(seed))salt = ''.join(sa)print saltreturn saltdef all():i=0while(i<10):pachong(suiji())if __name__ == "__main__":all()