模拟京东登陆 java_java-爬虫部分:关于京东模拟登陆的两种实现 | 学步园
最近要做一个爬虫,需要网站数据,先拿京东开刀。
因为我是java开发的,所以最开始的时候,想到了httpClient和htmlunit两个东东,于是开始做实验。
注意:京东会根据你的IP,多次登陆后,设置验证码,我目前正在解决这块,希望同志们如果有解决了的,能留言告诉我一下,最好加下我Q:369768231,非常感谢。
PS:后来想到一个解决方案:购买一个电话,然后ADSL上网,找一个IP切换的软件,设置多长时间切换一次。这样就不受影响了。
网上很久以前流传着一个登陆人人网的例子,我就拿过来照搬了一下,发现不灵,后来才发现是自己没理解人家的精髓。然后用htmlunit去模拟,发现京东的js比较复杂,一位多年爬虫经验的哥们告诉我说htmlunit对js支持的不好,有些网站就是不灵的。没办法,自己想吧。
(1)打开京东的登陆页面,看他的源码,发现是执行了一个ajax,具体链接是:https://passport.jd.com/uc/loginService?uuid=f5c0dd5a-762c-4230-b8c0-f70589b7dbdb&ReturnUrl=http://order.jd.com/center/list.action&r=0.66408410689742&loginname=username&nloginpwd=xxxxxx&loginpwd=xxxxxx&machineNet=&machineCpu=&machineDisk=&authcode=&saHrhnkIIX=GXgVo
每次刷新页面,uuid和最后一个参数都是不一样的。然后在火狐打开登陆页,把参数拼在一起后,直接访问火狐,没问题,登陆成功;但是在火狐打开登陆页,把参数拼起来后,在IE却不能打开。OK,看来是在cookie里存了一些东西后面做验证了。
基于以上分析,做了第一套代码:
核心代码如下:
package com.lkb.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.message.BufferedHeader;
import org.apache.http.protocol.HTTP;
public class JD {
// The configuration items
private static String userName = "xxx";
private static String password = "yyy";
private static String redirectURL = "http://order.jd.com/center/list.action";
private static String loginUrl = "http://passport.jd.com/uc/login";
// Don't change the following URL
private static String renRenLoginURL = "https://passport.jd.com/uc/loginService";
// The HttpClient is used in one session
private HttpResponse response;
private DefaultHttpClient httpclient = new DefaultHttpClient();
public Map getParams(){
Map map = new HashMap();
String str = getText(loginUrl);
String strs1[] = str.split("name=\"uuid\" value=\"");
String strs2[] = strs1[1].split("\"/>");
String uuid = strs2[0];
map.put("uuid", uuid);
System.out.println(strs2[0]);
String str3s[] = strs1[1].split("
String strs4[] = str3s[1].split("/>");
String strs5[] = strs4[0].trim().split("\"");
String key = strs5[0];
String value = strs5[2];
map.put(key, value);
return map;
}
private boolean login() {
Map map = getParams();
HttpPost httpost = new HttpPost(renRenLoginURL);
// All the parameters post to the web site
List nvps = new ArrayList();
nvps.add(new BasicNameValuePair("ReturnUrl", redirectURL));
nvps.add(new BasicNameValuePair("loginname", userName));
nvps.add(new BasicNameValuePair("nloginpwd", password));
nvps.add(new BasicNameValuePair("loginpwd", password));
Iterator it = map.keySet().iterator();
while(it.hasNext()) {
String key = it.next().toString();
String value = map.get(key).toString();
nvps.add(new BasicNameValuePair(key, value));
}
try {
httpost.setEntity(new UrlEncodedFormEntity((List extends org.apache.http.NameValuePair>) nvps, HTTP.UTF_8));
response = httpclient.execute(httpost);
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
httpost.abort();
}
return true;
}
private String getRedirectLocation() {
BufferedHeader locationHeader = (BufferedHeader) response.getFirstHeader("Location");
if (locationHeader == null) {
return null;
}
return locationHeader.getValue();
}
private String getText(String redirectLocation) {
HttpGet httpget = new HttpGet(redirectLocation);
ResponseHandler responseHandler = new BasicResponseHandler();
String responseBody = "";
try {
responseBody = httpclient.execute(httpget, responseHandler);
} catch (Exception e) {
e.printStackTrace();
responseBody = null;
} finally {
httpget.abort();
//httpclient.getConnectionManager().shutdown();
}
return responseBody;
}
public void printText() {
if (login()) {
System.out.println(getText(redirectURL));
String redirectLocation = getRedirectLocation();
if (redirectLocation != null) {
System.out.println(getText(redirectLocation));
}
}
}
public static void main(String[] args) {
JD renRen = new JD();
//renRen.getParams();
renRen.printText();
}
}
(2)后来在实践的过程又在想,如果每个网站都这么复杂,如果人家要是改了实现方式怎么办,于是又找到了selenuim2,发现这个东东是个好东东,可以实现模拟登陆,但是有一个缺点是要弹出页面,因为刚开始试验这个,所以还不熟悉。还有一点是你的操作需要设置sleep时间,不然会出问题。关于这一点还需要大家帮我改进一下,核心代码如下:
package com.lkb;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriver.Navigation;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class JDTest {
public static void main(String[] args) {
JDTest jd = new JDTest();
jd.connection();
}
public void connection(){
WebDriver driver = new FirefoxDriver();
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
Navigation navigation = driver.navigate();
navigation.to("https://passport.360buy.com/new/login.aspx");
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
WebElement loginName = driver.findElement(By.id("loginname"));
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
loginName.sendKeys(Constant.USERNAME);
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
WebElement loginPwd = driver.findElement(By.id("nloginpwd"));
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
loginPwd.sendKeys(Constant.password);
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
WebElement loginButton = driver.findElement(By.id("loginsubmit"));
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
waitForSecond();
loginButton.click();
waitForSecond();
navigation.to("http://order.jd.com/center/list.action");
System.out.println(driver.getPageSource());
//driver.close();
}
public void waitForSecond()
{
try
{
Thread. sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
以上的jar包和源码大家需要的话,可以联系我,QQ:369768231
对爬虫感兴趣的同学,请加我的Q群:101526096
后续还要做验证码的解决方案,有做过或者即将做的,也请加入Q群,一起讨论下。
开源才能进步,希望大家互相帮助,互相进步。
模拟京东登陆 java_java-爬虫部分:关于京东模拟登陆的两种实现 | 学步园相关推荐
- php 获取京东交易账号,PHP爬虫爬取京东列表
这里使用到了一个php插件下面是源码simple_html_dom.php defined('IN_ECS'); define('HDOM_TYPE_ELEMENT', 1); define('HDO ...
- java爬虫模拟post请求_java爬虫之使用HttpClient模拟浏览器发送请求方法详解
0. 摘要 0.1 添加依赖 org.apache.httpcomponents httpclient 4.5.2 0.2 代码 //1. 打开浏览器 创建httpclient对象 Closeable ...
- 怎样在京东上开网店、京东网店开店一步到位
怎样在京东上开网店,京东和淘宝开店区别,对于想开网店的朋友来说,可能会想到去淘宝网开店,但对于第一次运营网店的新手朋友来说,除了不了解还是不了解.所以,这并不是朋友们开网店的最理想选择.网店可以开淘宝 ...
- Python爬虫的两种请求方式,读者都了解吗?
Python爬虫中的get和post请求 前言 Python爬虫请求数据有get和post两种请求方式,也许读者对于它们的应用已经掌握到炉火纯青的地步了,但是关于它们的基本语法是否了解吗? 文章目录 ...
- “直接基于成本法”与“模拟权益法”两种合并报表模式比较与分析:响应新准则
"直接基于成本法"与"模拟权益法"两种合并报表编制模式比较与分析 --对新准则的响应(一) 在编制合并财务报表时,存在两种模式,一种方法是直接基于成本法编制,一 ...
- 京东模拟扫码登陆破解-爬虫
思路: 1.获取二维码图片并下载到本地 2.检测二维码状态(如是否失效,已被扫描等) 3.使用京东app扫描二维码后登陆成功并获取cookie 分析: 1.首先分析获取二维码 经过测试,改路由每次访问 ...
- 利用python爬虫爬取京东商城商品图片
笔者曾经用python第三方库requests来爬取京东商城的商品页内容,经过解析之后发现只爬到了商品页一半的图片.(这篇文章我们以爬取智能手机图片为例) 当鼠标没有向下滑时,此时查看源代码的话,就会 ...
- 爬虫爬取京东时被拦截到登录界面怎么办?
爬虫京东数据的时候,链接老是自动跳转到京东的登录页面?? 京东的识别,会把这种行为视为爬虫,所以我们要模拟浏览器的浏览行为 在创建HttpGet请求的时候,设置请求头部信息"User-Age ...
- Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索
Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索 一.资源 为什么接下来的代码中要使用el.getElementsByTa ...
- java 模拟登陆exe_Java简单模拟登陆和爬虫实例---博客园老牛大讲堂
鉴于有人说讲的不清楚,我这里再详细补充一下:更新日期:2017-11-23 本片文章适合初学者,只简单说了一下爬虫怎么用,和一个简单的小实例.不适合你的就可以不看了.----博客园老牛大讲堂 1.什么 ...
最新文章
- er图主码外码怎么看_霸屏了!因为这个老师,广科er纷纷表示要转专业了
- 数据可视化(matplotlib绘图)
- 简述一下动态sql的执行原理_简述一下Pogo Pin电连接器的设计原理和考虑因素
- SaaS的行业概述及发展现状
- 学生上课睡觉班主任怎么处理_学生上课睡觉鼾声如雷,老师要拍照发家长群吗?一线教师为你分析...
- 软考信息系统项目管理师_信息化与信息系统3_软件工程_新一代信息技术---软考高级之信息系统项目管理师005
- AbstractQueuedSynchronizer源码分析
- 100: cf 878C set+并查集+链表
- HDU 1181.变形课-并查集
- MaxCompute全套攻略
- 第三方支付接口有哪些?怎么申请?
- SpringCloud原理分析
- matlab提取多边形区域_如何利用Matlab求任意多边形的面积
- Unable to get offset lags for kafka. Reason: java.lang.NullPointerException at org.apache.storm.kafk
- 股价破300迎新年开门红,投资者们中了苹果的毒?
- 手把手教你成为荣耀开发者:如何获取平台帮助及最新通知?
- bootstrap 轮播插件
- 简易计算器(C语言实现)
- php技术创新:利用动态404页面实现全站自动静态化
- 前端面试题总结【持续更新···】
热门文章
- 面向对象设计 腾讯代码案例 学习人家的模式和格式
- 190420每日一句
- 190329每日一句
- Python 和 C++实现 九九乘法表
- Atitit 嵌入式tomcat 嵌入式服务器 attilax 你感觉艾提拉 总结 比起嵌入jetty ,文件可以自动刷新貌似还不错。。方便调试debug package com.attilax.
- Atitit osi tcp ip 对应attilax总结
- Atitit数据库层次架构表与知识点 attilax 总结
- 自动化设置chrome禁止显示图片及恢复
- paip.提升用户体验----解决浏览器关闭后自动退出的问题
- paip.提升用户体验---上传文件图片命名