爬虫java_浩哥带你进阶Java爬虫

大家好,我是百里半的华浩老师,今天给大家带来的是Java爬虫进阶知识点:Java爬虫如何处理cookies?

相信很多玩爬虫的同学都知道,有的网站需要登录才能访问,是因为它们所有请求会携带cookie信息,如果你没有登录,爬虫也是无法登录的,那么应该如何处理呢?这里以豆瓣为例带大家体验一把。

d7ce4807183c4d897a24c77c4e68e520.png

7d2b38e30908548e6e9f8736eb5da6ac.png

步骤展示:

1、下载Fiddler

该工具是用来抓包的,豆瓣网登录会重定向,浏览器的F12无法保留重定向之前的网站,所以需要下载Fiddler来抓包。该工具请自行百度下载。

2、配置Fiddler

配置不做详解,请参考此文:https://www.cnblogs.com/joshua317/p/8670923.html

如果文章失效,请百度:Fiddler https配置

3、分析豆瓣登录接口

打开豆瓣网站:https://www.douban.com/,这里我们叫它登录页面。打开Fiddler,如果fiddler有抓到内容,请按ctrl+x清除记录。

输入账号密码:

d807680c3ee68f498e25975fed763e78.png

点击登录,等它登录成功跳转首页后,切到fiddler,按F12停止抓包。

b5ca867cb0d7321c9c74a83505f40439.png

找到上图的登录请求,按步骤点击即可看到右边fiddler中抓到的表单参数。

得到内容如下:

# 登录地址:https://accounts.douban.com/j/mobile/login/basic# 登录参数:ck=name=账号password=密码remember=falseticket=""

再点击Headers,可以看到它的请求是post,另外还有一些cookie,那这些cookie哪来的?由于我们是从登录页面登录的,所以推测它是访问登录页面是设置的。

b62cc036c3a7c7891f8f6bbbe74270ac.png

再看该请求的响应内容,由于响应内容转码了,所以先点击一下,就能看到正确的响应内容了。

bc779a397486dce220a1ee1a32b9ef52.png

下面是转码后的内容,可以看到我们的昵称,所以只要判断响应内容里有没有我们的昵称就知道是否登录成功了。

7113a349ea854e7352e576d3bf99784d.png

以上信息就足够我们编写登录了。下面分析发表说说的接口。

4、分析发表说说接口

在登录成功后的界面中,输入要发表的内容,点击发布。

b9d653a99bf942f621a2a70bec62b184.png

切回fiddler中,可以看到发表说说的地址和它相关的参数

# 发表说说地址,可以看出和登录页面、首页地址相同。https://www.douban.com/# 发表说说参数:ck=VwDMcomment=发表的内容privacy_and_reply_limit=P,

c613b3bacde8460d4e360ad700dbf9cd.png

至此,我们就可以编写代码了。

5、编写代码

下面代码复制出去后,修改账号、密码、昵称这3个变量即可运行。

cookie的处理我封装在下面的get和post中,我是用一个map来装cookie的。

package com.blb;import org.jsoup.Connection;import org.jsoup.Jsoup;import java.io.IOException;import java.util.HashMap;import java.util.Map;import java.util.Scanner;public class App {    static String username = "你的账号";    static String password = "你的密码";    static String nickname = "你的昵称";        //用来判断是否登录成功    static String index = "https://www.douban.com/";    static String login = "https://accounts.douban.com/j/mobile/login/basic";    static Map<String, String> cookies = new HashMap<String, String>(); //用来存放cookies    public static void main(String[] args) throws IOException {        //访问登录页面,获取cookies        get(index);        //登录        Map<String, String> data = new HashMap();        data.put("ck", "");        data.put("name", username);        data.put("password", password);        data.put("remember", "false");        data.put("ticket", "");        Connection.Response response = post(login, data);        if (!response.body().contains(nickname)) {            System.out.println("登录失败");            return;        }        System.out.println("登录成功,欢迎使用豆瓣说说机器人");        //发表说说        Scanner scanner = new Scanner(System.in);        while (true){            System.out.println("请输入要发表的说说");            String context = scanner.nextLine();            data.clear();            data = new HashMap();            data.put("ck", "VwDM");            data.put("comment", context);            data.put("privacy_and_reply_limit", "P,");            post(index, data);            response = get(index);            if (!response.body().contains(context)) {                System.out.println("发表失败");                return;            }            System.out.println("发表成功");        }    }    /**     * 发送post请求     * @param url     * @param data     * @return     * @throws IOException     */    public static Connection.Response post(String url, Map<String, String> data) throws IOException {        Connection.Response response = Jsoup.connect(url)                .cookies(cookies)                .data(data)                .method(Connection.Method.POST)                .ignoreContentType(true)                .execute();        cookies.putAll(response.cookies());        return response;    }    /**     * 发送get请求     * @param url     * @return     * @throws IOException     */    public static Connection.Response get(String url) throws IOException {        Connection.Response response = Jsoup.connect(url)                .cookies(cookies)                .ignoreContentType(true)                .execute();        cookies.putAll(response.cookies());        return response;    }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值