使用HttpClient模拟登陆并爬取网页
在使用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模拟登陆并爬取网页相关推荐
- 【Python3.6爬虫学习记录】(十二)PhantomJS模拟登陆并爬取教务处学生照片(哈工大)
前言:这也不算心血来潮的事情,前面几天文章都涉及过,之前一直觉得很麻烦.必须SSLVPN登陆,到教务处页面,然后进行页面跳转到照片页面.所以每次打开图片页面都要保证登陆教务处,当然可以使用cookie ...
- 通过selenium模拟登陆新浪微博爬取首页和评论
1,获得登陆后的cookies,在通过cookiejar维持cookies(requests不能保存手动构建的cookies),并传入session中 2,在使用获得的session去请求页面,获得首 ...
- python爬虫爬网站数据登录_使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)...
urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...
- 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)
urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...
- java 爬取网页数据 多页爬取 jsoup 和 httpClient 实现
预览结果视图 目录 预览结果视图 介绍 代码 依赖 爬取网页数据代码 解析代码 解析介绍 完整代码 介绍 1.爬取通过org.jsoup 和HttpClients实现 2.爬取多页内容的时候进行循环, ...
- 基于Python 3.11.0版本模拟登录并爬取西安理工大学正方教务系统的学分绩点并计算
目录 使用软件以及运行环境 对于环境的搭建 代码思路 需要导入的包 模拟登录 爬取数据 绩点计算器 功能一 功能二 完整代码 使用软件以及运行环境 win10系统,Vs Code软件,Python 3 ...
- Python 利用 cookie 模拟登录,爬取指定关键词的淘宝商品信息
Python 利用 cookie 模拟登录,爬取指定关键词的淘宝商品信息-Selenium 1. 本文目标 由于淘宝网站的不断更新,以前的爬取方法都无法重现,必须需要登录淘宝网站才可以进行搜索商品.所 ...
- pycharm查看html页面,pycharm爬取网页数据
1 python环境的配置 1.1 安装python文件包,放到可以找到的位置 1.2 右键计算机->属性->高级环境设置->系统变量->Path->编辑->复制p ...
- python爬取网页信息
最近在学习python,发现通过python爬取网页信息确实方便,以前用C++写了个简单的爬虫,爬取指定网页的信息,代码随便一写都几百行,而要用python完成相同的工作,代码量相当少.前几天看到了一 ...
最新文章
- 【WPF】代码触发Button点击事件
- 基于ssm框架的大学生社团管理系统
- ubuntu15.10安装wireshark
- 图解SQL Server 安全函数的使用
- Maven的maven-clean-plugin插件详解
- 如何拷贝工程_如何将premiere的工程及素材文件打包?
- SQL SERVER PIVOT 行转列、列传行
- effective_transformer
- VS2013编译提示无法运行“rc.exe”错误
- Linux网络设备驱动程序
- 信息系统项目管理师---第八章 项目质量管理
- 工作笔记八——vue项目的多语言/国际化插件vue-i18n详解
- 运营100天的微信公众号能挣多少钱?
- QQ经典语句→思念之词
- xinxin- 新鑫牌计算器
- 剪切音频matlab_Matlab 按时间段切割音频
- IntelliJ IDEA 13 皮肤/编辑器字体设置
- windows内码、外码、字符映射表
- 无符号数与符号数比较大小
- 柞水溶洞门票 柞水溶洞门票价格
热门文章
- 雷军在2012年站长大会上的演讲实录--七字诀:专注\极致\口碑\快
- 3GPP R16码本(Enhanced Type2 Codebook)的构造方式
- csgo降低延迟指令_【显示FPS、延迟丢包率等参数】net_graph及相关指令
- “她经济”:新消费升级背景下3.8女王节的五大趋势
- iphone数据传输已取消怎么办_苹果同一个账号不想同步传输 苹果同一个id怎么取消同步...
- java江湖壹_江湖壹怎么玩 江湖壹新手功力提升攻略
- 陕西公办专科学校计算机,2017西安公办专科大学排名
- oracle t7 4,SPARC T7-1, T7-2, T7-4
- 调整word列表缩进
- Vue Element 表格实现拖拽排序