大家好,我是百里半的华浩老师,今天给大家带来的是Java爬虫进阶知识点:Java爬虫如何处理cookies?
相信很多玩爬虫的同学都知道,有的网站需要登录才能访问,是因为它们所有请求会携带cookie信息,如果你没有登录,爬虫也是无法登录的,那么应该如何处理呢?这里以豆瓣为例带大家体验一把。
步骤展示:
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清除记录。
输入账号密码:
点击登录,等它登录成功跳转首页后,切到fiddler,按F12停止抓包。
找到上图的登录请求,按步骤点击即可看到右边fiddler中抓到的表单参数。
得到内容如下:
# 登录地址:https://accounts.douban.com/j/mobile/login/basic# 登录参数:ck=name=账号password=密码remember=falseticket=""
再点击Headers,可以看到它的请求是post,另外还有一些cookie,那这些cookie哪来的?由于我们是从登录页面登录的,所以推测它是访问登录页面是设置的。
再看该请求的响应内容,由于响应内容转码了,所以先点击一下,就能看到正确的响应内容了。
下面是转码后的内容,可以看到我们的昵称,所以只要判断响应内容里有没有我们的昵称就知道是否登录成功了。
以上信息就足够我们编写登录了。下面分析发表说说的接口。
4、分析发表说说接口
在登录成功后的界面中,输入要发表的内容,点击发布。
切回fiddler中,可以看到发表说说的地址和它相关的参数
# 发表说说地址,可以看出和登录页面、首页地址相同。https://www.douban.com/# 发表说说参数:ck=VwDMcomment=发表的内容privacy_and_reply_limit=P,
至此,我们就可以编写代码了。
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; }}