Java爬虫初试02 登录--Jsoup and httpClient 正则表达

介绍:在使用爬虫时,对某些网站的爬取需要进行登录才能爬取到,在一般的带有登录的网站中通常采用cookie的方式保存信息,所以这里有两种方式:模拟登录  获取cookie以后的请求都带上cookie,直接登录网站  将cookie保存下来,相当于写死了;第一种当时比较灵活,第二中就会涉及到cookie过期

目标网站:豆瓣+我的用户名(binbin)

手动获取cookie:查看请求

 1 用Jsoup设置cookie,并查看节点

代码:

package Jsoup;

import HttpClient.HttpClientPc;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.IOException;

/**
 * 已经有了cookie
 */
public class LoginCookie {

    public static void main(String[] args) throws IOException {
        String url="https://www.douban.com/people/205769149/";
        LoginCookie loginCookie=new LoginCookie();
        String cookie="";
        loginCookie.setCookies(url,cookie);

    }



    /**
     * 手动设置 cookies
     * 先从网站上登录,然后查看 request headers 里面的 cookies
     * @param url
     * @throws IOException
     */
    public void setCookies(String url,String cookie) throws IOException {

        Document document =  org.jsoup.Jsoup.connect(url)
                // 手动设置cookies
                .header("Cookie", cookie)
                .get();
        //
        if (document != null) {
            // 获取豆瓣昵称节点
            Element element = document.select(".info h1").first();
            if (element == null) {
                System.out.println("没有找到 .info h1 标签");
                return;
            }
            // 取出豆瓣节点昵称
            String userName = element.ownText();
            System.out.println("豆瓣我的网名为:" + userName);
        } else {
            System.out.println("出错啦!!!!!");
        }
    }

}

 运行结果:

模拟登录方式:登录链接:登录豆瓣

代码:

package Jsoup;

import org.jsoup.Connection;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class login {

    public static void main(String[] args) throws IOException {
        String loginUrl="https://accounts.douban.com/j/mobile/login/basic";
        String userInfoUrl="https://www.douban.com/people/205769149/";
        login login=new login();
        login.jsoupLogin(loginUrl,userInfoUrl);

    }


    /**
     * Jsoup 模拟登录豆瓣 访问个人中心
     * 在豆瓣登录时先输入一个错误的账号密码,查看到登录所需要的参数
     * 先构造登录请求参数,成功后获取到cookies
     * 设置request cookies,再次请求
     * @param loginUrl 登录url   :https://accounts.douban.com/j/mobile/login/basic
     * @param userInfoUrl 个人中心url    https://www.douban.com/people/205769149/
     * @throws IOException
     */
    public void jsoupLogin(String loginUrl,String userInfoUrl)  throws IOException {

        // 构造登陆参数
        Map<String,String> data = new HashMap<>();
        data.put("name","用户名");
        data.put("password","密码");
        data.put("remember","false");
        data.put("ticket","");
        data.put("ck","");
        Connection.Response login = org.jsoup.Jsoup.connect(loginUrl)
                .ignoreContentType(true) // 忽略类型验证
                .followRedirects(false) // 禁止重定向
                .postDataCharset("utf-8")
                .header("Upgrade-Insecure-Requests","1")
                .header("Accept","application/json")
                .header("Content-Type","application/x-www-form-urlencoded")
                .header("X-Requested-With","XMLHttpRequest")
                .header("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36")
                .data(data)
                .method(Connection.Method.POST)
                .execute();
        login.charset("UTF-8");
        // login 中已经获取到登录成功之后的cookies
        // 构造访问个人中心的请求
        Document document = org.jsoup.Jsoup.connect(userInfoUrl)
                // 取出login对象里面的cookies
                .cookies(login.cookies())
                .get();
        if (document != null) {
            Element element = document.select(".info h1").first();
            if (element == null) {
                System.out.println("没有找到 .info h1 标签");
                return;
            }
            String userName = element.ownText();
            System.out.println("豆瓣我的网名为:" + userName);
        } else {
            System.out.println("出错啦!!!!!");
        }
    }

}

成功

2 使用httpclient模拟登录

好处:jsoup需要每一次请求都登陆,但是httpclient会保存session会话,登陆一次就会进行保存,以后无需登录

代码:

package HttpClient;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.net.URI;

public class login {

    public static void main(String[] args) throws Exception {
        String loginUrl="https://accounts.douban.com/j/mobile/login/basic";
        String userInfoUrl="https://www.douban.com/people/205769149/";
        login login=new login();
        login.httpClientLogin(loginUrl,userInfoUrl);

    }


    /**
     * httpclient 的方式模拟登录豆瓣
     * httpclient 跟jsoup差不多,不同的地方在于 httpclient 有session的概念
     * 在同一个httpclient 内不需要设置cookies ,会默认缓存下来
     * @param loginUrl
     * @param userInfoUrl
     */
    public void httpClientLogin(String loginUrl,String userInfoUrl) throws Exception{

        CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpUriRequest login = RequestBuilder.post()
                .setUri(new URI(loginUrl))// 登陆url
                .setHeader("Upgrade-Insecure-Requests","1")
                .setHeader("Accept","application/json")
                .setHeader("Content-Type","application/x-www-form-urlencoded")
                .setHeader("X-Requested-With","XMLHttpRequest")
                .setHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36")
                // 设置账号信息
                .addParameter("name","用户名")
                .addParameter("password","密码")
                .addParameter("remember","false")
                .addParameter("ticket","")
                .addParameter("ck","")
                .build();
        // 模拟登陆
        CloseableHttpResponse response = httpclient.execute(login);
        if (response.getStatusLine().getStatusCode() == 200){
            // 构造访问个人中心请求
            HttpGet httpGet = new HttpGet(userInfoUrl);
            CloseableHttpResponse user_response = httpclient.execute(httpGet);
            HttpEntity entity = user_response.getEntity();
            //拿到body
            String body = EntityUtils.toString(entity, "utf-8");

            // 直接判断 用户名binbin是否存在
            System.out.println("binbin是否查找到?"+(body.contains("binbin")));
        }else {
            System.out.println("httpclient 模拟登录豆瓣失败了!!!!");
        }
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔芋小灰菜

不要下次一定,要一键三连

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值