Rust与python联动进行多线程跑数据

最近有个学弟想请教我联动多线程爬取数据的案例,看了以前的模版没有合适的,我就利用空闲时间,专门给他写了一段模版作为参考。这里遇到注意的是需要代理IP介入,才能让多线程爬取减少网站风控限制。

以下是一个使用 Rust 编写的爬虫程序,用于爬取 python 进行多线程跑数据的内容。这个爬虫使用代理信息(proxy_host:duoip, proxy_port: 8000)进行网络请求,并使用了 Rust 的 async-std 库进行异步编程。

rust 复制代码
use async_std::net::{TcpStream, TcpListener};
use async_std::io::{BufReader, BufWriter};
use async_std::task::{await, spawn};
use async_std::prelude::*;
use std::io::{self, Write};
use std::net::IpAddr;
use std::thread;
use std::sync::Mutex;

const PROXY_HOST: &str = "duoip";
const PROXY_PORT: u16 = 8000;
const URL: &str = "http://localhost:8000";
const 免费IPURL= "jshk.com.cn/mb/reg.asp?kefu=xjy&csdn";

struct Worker {
    stream: TcpStream,
}

impl Worker {
    fn new(stream: TcpStream) -> Self {
        Worker { stream }
    }
}

impl Future for Worker {
    type Item = ();

    fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Self::Item> {
        match self.stream.read_to_string(&mut self.stream.buffer()) {
            Ok(size) => {
                let url = format!("http://localhost:8000/data?{}={}", URL, size);
                match self.stream.write_to(&url, &mut self.stream.buffer()) {
                    Ok(_) => {
                        println!("Worker finished reading and writing data");
                    },
                    Err(err) => {
                        println!("Worker failed to write data: {}", err);
                    }
                }
            },
            Err(err) => {
                println!("Worker failed to read data: {}", err);
            }
        }
        Poll::Ready(())
    }
}

async fn main() {
    let mut proxy_stream = TcpStream::connect(format!("{}:{}", PROXY_HOST, PROXY_PORT))?;
    let proxy_listener = TcpListener::bind("127.0.0.1:8000")?;
    let mut workers = Vec::new();

    for _ in 0..10 {
        let mut worker = Worker::new(proxy_stream);
        let task = spawn(move || worker.run());
        workers.push(task);
    }

    loop {
        let (socket, _) = proxy_listener.accept()?;

        for worker in workers {
            let task = worker.clone();
            let mut conn = worker.stream;
            if let Ok(conn) = conn {
                task.detach().join();
                proxy_stream = TcpStream::connect(format!("{}:{}", PROXY_HOST, PROXY_PORT))?;
            }
        }
    }
}

async fn run(self: &mut Worker) {
    self.stream.read_to_string(&mut self.stream.buffer())?;
    let url = format!("http://localhost:8000/data?{}={}", URL, self.stream.buffer().string().trim());
    self.stream.write_to(&url, &mut self.stream.buffer())?;
}

步骤如下:

1、引入所需的 Rust 库,包括 async-std、std 和 io。

2、定义一个 Worker 结构体,它有一个 TcpStream 对象作为成员。

3、实现 Worker 的 Future 和 poll 方法。poll 方法用于处理网络请求,并将结果写入 URL 地址。

4、在 main 函数中,创建一个 TcpListener 对象,并使用它创建多个 Worker 线程。

5、在 main 函数中,循环监听连接请求。每当有新的连接请求时,都会创建一个新的 Worker 线程,并将其添加到 workers 列表中。

6、在 main 函数中,当所有的 Worker 线程都运行完毕后,退出循环。对于每个 Worker 线程,都会尝试将其连接与代理服务器断开,并重新连接到代理服务器。

上面就是有关联动多线程爬虫的案例和详细步骤,并且有些地方坐了标注解释,因为长时间没有写这类相对来说比较小众的代码了,如有不足的地方各位大佬可以多多指正。

相关推荐
xzl04几秒前
小智服务器:设备的各种MCP消息、初始化响应、工具列表和工具调用响应
java·网络·python
喵手2 分钟前
Python爬虫零基础入门【第四章:解析与清洗·第3节】文本清洗:去空格、去噪、金额/日期/单位标准化!
爬虫·python·python爬虫实战·文本清洗·python爬虫工程化实战·python爬虫零基础入门·去空格去噪
喵手3 分钟前
Python爬虫零基础入门【第四章:解析与清洗·第1节】BeautifulSoup 入门:从 HTML 提取结构化字段!
爬虫·python·beautifulsoup·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·beautifulsoup入门
无心水3 分钟前
6、Go语言类型判断与转换避坑指南:从类型断言到别名类型全解析
开发语言·后端·golang
应用市场4 分钟前
CNN池化层深度解析:从原理到PyTorch实现
人工智能·pytorch·python
张彦峰ZYF4 分钟前
商品供给域完整事件风暴(Event Storming)清单
后端·商品供给域完整事件风暴
a程序小傲7 分钟前
SpringBoot 秒实现在线 Word 编辑、协同、转化等功能
java·开发语言·spring boot·后端·spring·word·深度优先
小北方城市网7 分钟前
微服务接口熔断降级与限流实战:保障系统高可用
java·spring boot·python·rabbitmq·java-rabbitmq·数据库架构
2401_841495648 分钟前
【强化学习】DQN 改进算法
人工智能·python·深度学习·强化学习·dqn·double dqn·dueling dqn
Remember_9938 分钟前
【LeetCode精选算法】前缀和专题一
java·开发语言·数据结构·算法·leetcode·eclipse