rust 豆瓣影评爬虫小尝试

一、开发环境及配置

使用IntelliJ IDEA在本地输写代码,然后通过IntelliJ IDEA自身的ssh功能实现远程连接linux,并上传文件到linux服务器,通过IntelliJ IDEA shell功能运行程序测试
一.配置idea SSH会话

快速创建一个SSH会话,并打开Terminal窗口

点击Tools 选择Start SSH session 如下图:
在这里插入图片描述
然后点击Edit credentials…

在这里插入图片描述
填写主机ip,用户名,密码和端口号,注意SSH会话以及SFTP的端口号为22,填写完成点击ok后会自动连接并开启Terminal窗口,熟悉的SSH会话界面就出现了,如下图:
在这里插入图片描述

注意:以上介绍的只是临时开启SSH会话,并且不具备SFTP功能,一旦关闭该会话窗口,刚才输入的连接信息就找不到了,该方法只适合于临时操作一下远程服务器。

第二节,配置SSH会话和SFTP文件上传
在这里插入图片描述

点击绿色的加号,弹出一个小窗口,添加连接名称和连接类型:
在这里插入图片描述
这里名称随便输入,这里以测试主机IP为连接名称,类型选择SFTP后点击ok

在这里插入图片描述

填写上图红框内的相关信息,注意Save password请务必勾选上。

注意:Visible only for this project是确定该会话在哪些工程中显示,勾选就只在本工程中显示该会话,不勾选就在所有的工程中显示。最下面的Web server root URL是该项目在部署后的链接,点击open可打开该项目。Root path是指定自动上传到linux服务器的路径,这里就选择测试主机的/root目录。

点击Test SFTP connection…可以测试是否可以连接上远程linux服务器

在这里插入图片描述
然后点击Advanced options…设置字符编码格式

在这里插入图片描述

将Control encoding设置成UTF-8,至于为什么,不解释…

点击ok保存

然后再点击Mappings切换到SFTP上传路径设置

在这里插入图片描述

Local path是本地要上传的文件路径,Deployment path是上传到服务器的路径,这里设置直接上传到/目录下,即/root目录下。再点击配置窗口的ok保存该配置信息。

现在再打开Tools下面的Start SSH session就多了一个刚才配置的会话名称
在这里插入图片描述

现在重启IDEA、关机,会话配置信息都不会丢失,随时连接,很方便。

第三节,SSH功能和SFTP上传功能示例操作
在这里插入图片描述
右键点击要上传的文件,依次选择Deployment——Upload to…
在这里插入图片描述
上传完成

在这里插入图片描述
至此配置完成,以后可以通过idea写代码并同步到liunx,通过shell编译运行代码;

二、豆瓣爬虫代码

1.使用了hyper网络库进行数据加载

2.select进行html解析

库地址请查看 https://blog.csdn.net/m0_37696990/article/details/82812729
main.rs

extern crate hyper;
extern crate select;

use std::io::Read;
use hyper::Client;
use std::fs::File;
//use std::fs::create_dir_all;

//use std::io::{BufWriter};

use select::document::Document;
use select::predicate::{ Class};

use std::error::Error;
use std::io::prelude::*;

use std::path::Path;

fn main() {
    let mut start = 0;
    while start < 900 {
        println!("start的值:{}",start);
       get_date(&mut start,);
    }
}

fn get_date(start: &mut i32){
    let client = Client::new();
    let url = "https://movie.douban.com/subject/1866479/reviews?start=";
    let num_str = format!("{0}{1}", url.to_string(), start);//拼接字符串

    //println!("url{}",num_str);
    let mut res = client.get(num_str.trim()).send().unwrap();
    /*assert_eq!(res.status, hyper::Ok);
    println!("headers:\n {}", res.headers);*/
    let mut body = String::new();
    res.read_to_string(&mut body).unwrap();
    let   htmlbody= body.trim();
    /*  println!("body:\n {}", htmlbody);*/
    let document = Document::from(htmlbody);

    let mut content = String::from("");//单页数据
    for node in document.find(Class("main-bd")) {
        let question = node.find(Class("short-content")).next().unwrap();
        let qes_str = question.text();
        let  qes_str=  qes_str.replace("\n","").replace("\t","").replace("\r","").replace(" ","");
        let qes_str = format!("{0}{1}{2}", "start:", qes_str,"\r\n");//拼接字符串
       /* content.add(qes_str);*/
        &content.push_str(&qes_str);
    }
    let pathname = format!("{0}{1}{2}","./",start,"-page.txt" );//拼接字符串
    //println!("一页内容{}",&content);
    wtrie_file(&pathname,&mut content);
    *start+=20;
}
//写入文件
fn wtrie_file(path:&String ,conetent:&mut String){
    let path = Path::new(path);
    let display = path.display();
    let mut file = match File::create(&path) {
        Err(why) => panic!("创建文件失败{}: {}",display, why.description()),
        Ok(file) => file,
    };
    match file.write_all(conetent.as_bytes()) {
        Err(why) => {
            panic!("写入失败 {}: {}", display,
                   why.description())
        },
        Ok(_) => println!("成功写入 {}", display),
    }
}

                    

Cargo.toml

[package]
name = "hypertest2"
version = "0.1.0"
authors =
edition = "2018"

[dependencies]
hyper = "0.7.2"
select = "0.4.2"

idea terminal乱码问题

爬取页面的html内容在 idea terminal查看乱码,参照该博客http://www.cnblogs.com/sxdcgaq8080/p/9071282.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值