在使用Java进行网页爬虫时经常需要携带登陆的 Cookie 信息,然而 Cookie 是有时效性的,所以经常会碰到 Cookie 失效的情况。如何在 Cookie 失效后自动重新获取成了爬虫急需解决的难题。

本文将示例如何使用 HttpClient 模拟登陆某知名猫平台并获取其登录的 Cookie 信息。

pom.xml 文件中引入 HttpClient 依赖包:

     <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.6</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.10</version></dependency>

获取 Cookie 的完整代码如下:


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.CookieStore;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;import com.wpp.dc.task.common.config.Constant;public class CookieUtils {public static void main(String[] args) {Map<String, String> headParamsMap = new HashMap<String, String>();headParamsMap.put("Host", "login.taobao.com");headParamsMap.put("Referer","https://sycm.taobao.com/custom/login.htm?_target=http://sycm.taobao.com/portal/home.htm");Map<String, String> formMap = new HashMap<String, String>();formMap.put("TPL_username", "登录账号");formMap.put("TPL_password_2", "账号密码");formMap.put("TPL_redirect_url", "http://sycm.taobao.com/portal/home.htm");String cookieStr = getCookieByDoPost("https://login.taobao.com/member/login.jhtml", headParamsMap, formMap,"utf-8");System.out.println(cookieStr);}public static String getCookieByDoPost(String url, Map<String, String> headParamsMap, Map<String, String> formMap,String charset) {CloseableHttpClient httpClient = null;HttpPost httpPost = null;StringBuffer cookie = new StringBuffer();try {CookieStore cookieStore = new BasicCookieStore();httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();httpPost = new HttpPost(url);// 设置请求体参数List<NameValuePair> list = new ArrayList<NameValuePair>();Iterator<Entry<String, String>> iterator = formMap.entrySet().iterator();while (iterator.hasNext()) {Entry<String, String> elem = (Entry<String, String>) iterator.next();list.add(new BasicNameValuePair(elem.getKey(), elem.getValue()));}if (list.size() > 0) {UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);httpPost.setEntity(entity);}// 设置请求头通用信息httpPost.addHeader("Accept", "*/*");httpPost.addHeader("Accept-Language", "zh-CN,zh;q=0.8");httpPost.addHeader("Connection", "keep-alive");httpPost.addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");Set<Entry<String, String>> entrySet = headParamsMap.entrySet();for (Entry<String, String> entry : entrySet) {httpPost.addHeader(entry.getKey(), entry.getValue());}HttpResponse response = httpClient.execute(httpPost);if (response != null) {int statusCode = response.getStatusLine().getStatusCode();if (statusCode == HttpStatus.SC_OK) {// 获得CookiesList<Cookie> cookies = cookieStore.getCookies();for (Cookie c : cookies) {cookie.append(c.getName()).append("=").append(c.getValue()).append(";");if (c.getName().equals("_tb_token_")) {tokenStr = c.getValue();}}}}} catch (Exception ex) {ex.printStackTrace();} finally {httpPost.abort();}return cookie.toString();}
}

使用HttpClient模拟登陆并爬取网页相关推荐

  1. 【Python3.6爬虫学习记录】(十二)PhantomJS模拟登陆并爬取教务处学生照片(哈工大)

    前言:这也不算心血来潮的事情,前面几天文章都涉及过,之前一直觉得很麻烦.必须SSLVPN登陆,到教务处页面,然后进行页面跳转到照片页面.所以每次打开图片页面都要保证登陆教务处,当然可以使用cookie ...

  2. 通过selenium模拟登陆新浪微博爬取首页和评论

    1,获得登陆后的cookies,在通过cookiejar维持cookies(requests不能保存手动构建的cookies),并传入session中 2,在使用获得的session去请求页面,获得首 ...

  3. python爬虫爬网站数据登录_使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)...

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  4. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  5. java 爬取网页数据 多页爬取 jsoup 和 httpClient 实现

    预览结果视图 目录 预览结果视图 介绍 代码 依赖 爬取网页数据代码 解析代码 解析介绍 完整代码 介绍 1.爬取通过org.jsoup 和HttpClients实现 2.爬取多页内容的时候进行循环, ...

  6. 基于Python 3.11.0版本模拟登录并爬取西安理工大学正方教务系统的学分绩点并计算

    目录 使用软件以及运行环境 对于环境的搭建 代码思路 需要导入的包 模拟登录 爬取数据 绩点计算器 功能一 功能二 完整代码 使用软件以及运行环境 win10系统,Vs Code软件,Python 3 ...

  7. Python 利用 cookie 模拟登录,爬取指定关键词的淘宝商品信息

    Python 利用 cookie 模拟登录,爬取指定关键词的淘宝商品信息-Selenium 1. 本文目标 由于淘宝网站的不断更新,以前的爬取方法都无法重现,必须需要登录淘宝网站才可以进行搜索商品.所 ...

  8. pycharm查看html页面,pycharm爬取网页数据

    1 python环境的配置 1.1 安装python文件包,放到可以找到的位置 1.2 右键计算机->属性->高级环境设置->系统变量->Path->编辑->复制p ...

  9. python爬取网页信息

    最近在学习python,发现通过python爬取网页信息确实方便,以前用C++写了个简单的爬虫,爬取指定网页的信息,代码随便一写都几百行,而要用python完成相同的工作,代码量相当少.前几天看到了一 ...

最新文章

  1. 【WPF】代码触发Button点击事件
  2. 基于ssm框架的大学生社团管理系统
  3. ubuntu15.10安装wireshark
  4. 图解SQL Server 安全函数的使用
  5. Maven的maven-clean-plugin插件详解
  6. 如何拷贝工程_如何将premiere的工程及素材文件打包?
  7. SQL SERVER PIVOT 行转列、列传行
  8. effective_transformer
  9. VS2013编译提示无法运行“rc.exe”错误
  10. Linux网络设备驱动程序
  11. 信息系统项目管理师---第八章 项目质量管理
  12. 工作笔记八——vue项目的多语言/国际化插件vue-i18n详解
  13. 运营100天的微信公众号能挣多少钱?
  14. QQ经典语句→思念之词
  15. xinxin- 新鑫牌计算器
  16. 剪切音频matlab_Matlab 按时间段切割音频
  17. IntelliJ IDEA 13 皮肤/编辑器字体设置
  18. windows内码、外码、字符映射表
  19. 无符号数与符号数比较大小
  20. 柞水溶洞门票 柞水溶洞门票价格

热门文章

  1. 雷军在2012年站长大会上的演讲实录--七字诀:专注\极致\口碑\快
  2. 3GPP R16码本(Enhanced Type2 Codebook)的构造方式
  3. csgo降低延迟指令_【显示FPS、延迟丢包率等参数】net_graph及相关指令
  4. “她经济”:新消费升级背景下3.8女王节的五大趋势
  5. iphone数据传输已取消怎么办_苹果同一个账号不想同步传输 苹果同一个id怎么取消同步...
  6. java江湖壹_江湖壹怎么玩 江湖壹新手功力提升攻略
  7. 陕西公办专科学校计算机,2017西安公办专科大学排名
  8. oracle t7 4,SPARC T7-1, T7-2, T7-4
  9. 调整word列表缩进
  10. Vue Element 表格实现拖拽排序