QQ附近人采集工具,可提取附近人同地区用户,jar实现具体的开发效果【仅供学习参考】

简介: 本项目为QQ附近人数据采集工具,含四个核心模块:主采集程序使用多线程请求API,坐标生成器创建采集点网格覆盖目标区域,用户数据以自定义结构存储,导出模块利用Apache POI实现实时Excel写入。

下载地址:https://pan38.com/share.php?code=TnZ89 提取码:8888
源码部分:【仅供学习参考】
该工具包含四个核心模块:主采集程序负责多线程请求,坐标生成器创建采集点网格,数据结构保存用户信息,导出模块实现Excel实时写入

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.concurrent.*;

public class QQNearbyCrawler {
private static final String API_URL = "https://ti.qq.com/nearby/people";
private static final int THREADS = 5;
private static BlockingQueue dataQueue = new LinkedBlockingQueue<>();

public static void main(String[] args) {
    ExecutorService executor = Executors.newFixedThreadPool(THREADS);
    new Thread(new DataExporter()).start();

    List<Coordinate> coords = CoordinateGenerator.generate(39.9, 116.4, 0.1, 50);
    coords.forEach(coord -> executor.execute(new CrawlTask(coord)));
}

static class CrawlTask implements Runnable {
    private Coordinate coord;
    public CrawlTask(Coordinate coord) { this.coord = coord; }

    @Override
    public void run() {
        try {
            CloseableHttpClient client = HttpClients.createDefault();
            HttpGet request = new HttpGet(API_URL+"?lat="+coord.lat+"&lng="+coord.lng);
            request.setHeader("User-Agent", "Mozilla/5.0");

            CloseableHttpResponse response = client.execute(request);
            JSONObject json = new JSONObject(EntityUtils.toString(response.getEntity()));
            JSONArray users = json.getJSONArray("data");

            for(int i=0; i<users.length(); i++) {
                JSONObject user = users.getJSONObject(i);
                dataQueue.put(new UserData(
                    user.getString("nickname"),
                    user.getInt("gender"),
                    user.getInt("age"),
                    user.getDouble("distance")
                ));
            }
        } catch (Exception e) { e.printStackTrace(); }
    }
}

}

java.util.ArrayList;
import java.util.List;

public class CoordinateGenerator {
public static List generate(double centerLat, double centerLng,
double radius, int count) {
List coords = new ArrayList<>();
double step = radius / Math.sqrt(count);

    for(int i=0; i<count; i++) {
        double angle = Math.PI * 2 * i / count;
        double r = step * Math.sqrt(i);
        coords.add(new Coordinate(
            centerLat + r * Math.cos(angle) * 0.009,
            centerLng + r * Math.sin(angle) * 0.011
        ));
    }
    return coords;
}

}

class Coordinate {
double lat, lng;
public Coordinate(double lat, double lng) {
this.lat = lat;
this.lng = lng;
}
}

class UserData {
private String nickname;
private int gender;
private int age;
private double distance;

public UserData(String nickname, int gender, int age, double distance) {
    this.nickname = nickname;
    this.gender = gender;
    this.age = age;
    this.distance = distance;
}
// getters...

}

org.apache.poi.xssf.usermodel.;
import java.io.FileOutputStream;
import java.util.concurrent.
;

public class DataExporter implements Runnable {
private static final String[] HEADERS = {"昵称","性别","年龄","距离"};

@Override
public void run() {
    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet("QQ附近人");

    // 创建表头
    XSSFRow headerRow = sheet.createRow(0);
    for(int i=0; i<HEADERS.length; i++) 
        headerRow.createCell(i).setCellValue(HEADERS[i]);

    int rowNum = 1;
    while(true) {
        try {
            UserData user = QQNearbyCrawler.dataQueue.take();
            XSSFRow row = sheet.createRow(rowNum++);
            row.createCell(0).setCellValue(user.getNickname());
            row.createCell(1).setCellValue(user.getGender()==1?"男":"女");
            row.createCell(2).setCellValue(user.getAge());
            row.createCell(3).setCellValue(user.getDistance());

            if(rowNum % 100 == 0) 
                workbook.write(new FileOutputStream("qq_nearby.xlsx"));
        } catch (Exception e) { e.printStackTrace(); }
    }
}

}

相关文章
|
6月前
|
Java API 数据安全/隐私保护
手机无人直播手机用啥软件,抖音快手无人直播工具,jar代码分享
这个无人直播系统包含视频处理、直播推流和自动化控制三个核心模块。使用mvn package命
|
6月前
|
Java 数据安全/隐私保护 计算机视觉
手机虚拟视频替换摄像头,QQ微信虚拟视频插件,jar代码分享
这段代码演示了如何使用JavaCV捕获视频流、处理帧数据并输出到虚拟摄像头设备。它需要JavaCV和OpenCV库支持
|
6月前
|
Java 数据安全/隐私保护
阿里旺旺群发器,淘宝阿里旺旺私信群发工具,卖家自动发私信脚本【jar源码】
这段代码实现了一个模拟的阿里旺旺群发工具框架,包含核心发送功能、配置管理和联系人管理模块
|
7月前
|
Java API
wxid添加微信好友工具,免费微信wxid转换器二维码,jar实现仅供学习参考
本项目实现微信ID与wxid的转换及二维码生成功能,核心逻辑基于ZXing库完成QR编码,支持文件批量导入导出。
|
7月前
|
编解码 自然语言处理 Java
安卓改机工具免root,一键过设备检测,串号SN码【jar即可实现】
本项目通过Hook系统API实现设备信息的拦截与修改,主要功能包括动态更改IMEI/SN等设备标识。核心技术基于Xposed框架(免Root可用VirtualXposed)
|
7月前
|
XML 监控 安全
陌陌动态小尾巴留微信号, 陌陌最新留微信号技巧,通过JAR插件实现【仅供学习参考】
我们玩陌陌经常看到,别人的动态都能留微信号,但是我们总是都发不了,这是因为陌陌的安全机制导致的,手动发布会大致出发风控机制,但是用插件可以避免这个问题。
|
Java 开发者
修改JAR文件工具
本文介绍了一款名为JarEditor的IDEA插件,该插件允许用户直接对JAR包内的文件进行增删改查操作,无需先行解压。通过简单的安装与使用步骤,大大简化了传统上需要解压缩、反编译、重新编译及打包的过程。此外,JarEditor还支持对混淆过的JAR文件进行字节码级别的修改,并提供了强大的搜索功能,支持大小写、全词匹配和正则表达式搜索。对于开发者而言,这款插件无疑极大提高了处理JAR文件的效率和便捷性。
895 14
|
Java Maven 容器
Maven使用IDEA自带工具打包,同时将lib下的jar包打入,双击jar包可直接运行
使用IntelliJ IDEA的Artifacts功能,可以将项目依赖的第三方jar包打包进jar文件中,实现双击jar包即可直接运行。
Maven使用IDEA自带工具打包,同时将lib下的jar包打入,双击jar包可直接运行
|
监控 Java
Java项目jar性能监控工具CPU内存等
Java项目jar性能监控工具CPU内存等
473 0
maven管理工具使用package打包的时候无法将lib文件夹下的第三方jar包打入,上线打jar包后运行异常问题
maven管理工具使用package打包的时候无法将lib文件夹下的第三方jar包打入,上线打jar包后运行异常问题

热门文章

最新文章