最近要做一个爬虫,需要网站数据,先拿京东开刀。

因为我是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-爬虫部分:关于京东模拟登陆的两种实现 | 学步园相关推荐

  1. php 获取京东交易账号,PHP爬虫爬取京东列表

    这里使用到了一个php插件下面是源码simple_html_dom.php defined('IN_ECS'); define('HDOM_TYPE_ELEMENT', 1); define('HDO ...

  2. java爬虫模拟post请求_java爬虫之使用HttpClient模拟浏览器发送请求方法详解

    0. 摘要 0.1 添加依赖 org.apache.httpcomponents httpclient 4.5.2 0.2 代码 //1. 打开浏览器 创建httpclient对象 Closeable ...

  3. 怎样在京东上开网店、京东网店开店一步到位

    怎样在京东上开网店,京东和淘宝开店区别,对于想开网店的朋友来说,可能会想到去淘宝网开店,但对于第一次运营网店的新手朋友来说,除了不了解还是不了解.所以,这并不是朋友们开网店的最理想选择.网店可以开淘宝 ...

  4. Python爬虫的两种请求方式,读者都了解吗?

    Python爬虫中的get和post请求 前言 Python爬虫请求数据有get和post两种请求方式,也许读者对于它们的应用已经掌握到炉火纯青的地步了,但是关于它们的基本语法是否了解吗? 文章目录 ...

  5. “直接基于成本法”与“模拟权益法”两种合并报表模式比较与分析:响应新准则

    "直接基于成本法"与"模拟权益法"两种合并报表编制模式比较与分析 --对新准则的响应(一) 在编制合并财务报表时,存在两种模式,一种方法是直接基于成本法编制,一 ...

  6. 京东模拟扫码登陆破解-爬虫

    思路: 1.获取二维码图片并下载到本地 2.检测二维码状态(如是否失效,已被扫描等) 3.使用京东app扫描二维码后登陆成功并获取cookie 分析: 1.首先分析获取二维码 经过测试,改路由每次访问 ...

  7. 利用python爬虫爬取京东商城商品图片

    笔者曾经用python第三方库requests来爬取京东商城的商品页内容,经过解析之后发现只爬到了商品页一半的图片.(这篇文章我们以爬取智能手机图片为例) 当鼠标没有向下滑时,此时查看源代码的话,就会 ...

  8. 爬虫爬取京东时被拦截到登录界面怎么办?

    爬虫京东数据的时候,链接老是自动跳转到京东的登录页面?? 京东的识别,会把这种行为视为爬虫,所以我们要模拟浏览器的浏览行为 在创建HttpGet请求的时候,设置请求头部信息"User-Age ...

  9. Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索

    Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索 一.资源 为什么接下来的代码中要使用el.getElementsByTa ...

  10. java 模拟登陆exe_Java简单模拟登陆和爬虫实例---博客园老牛大讲堂

    鉴于有人说讲的不清楚,我这里再详细补充一下:更新日期:2017-11-23 本片文章适合初学者,只简单说了一下爬虫怎么用,和一个简单的小实例.不适合你的就可以不看了.----博客园老牛大讲堂 1.什么 ...

最新文章

  1. er图主码外码怎么看_霸屏了!因为这个老师,广科er纷纷表示要转专业了
  2. 数据可视化(matplotlib绘图)
  3. 简述一下动态sql的执行原理_简述一下Pogo Pin电连接器的设计原理和考虑因素
  4. SaaS的行业概述及发展现状
  5. 学生上课睡觉班主任怎么处理_学生上课睡觉鼾声如雷,老师要拍照发家长群吗?一线教师为你分析...
  6. 软考信息系统项目管理师_信息化与信息系统3_软件工程_新一代信息技术---软考高级之信息系统项目管理师005
  7. AbstractQueuedSynchronizer源码分析
  8. 100: cf 878C set+并查集+链表
  9. HDU 1181.变形课-并查集
  10. MaxCompute全套攻略
  11. 第三方支付接口有哪些?怎么申请?
  12. SpringCloud原理分析
  13. matlab提取多边形区域_如何利用Matlab求任意多边形的面积
  14. Unable to get offset lags for kafka. Reason: java.lang.NullPointerException at org.apache.storm.kafk
  15. 股价破300迎新年开门红,投资者们中了苹果的毒?
  16. 手把手教你成为荣耀开发者:如何获取平台帮助及最新通知?
  17. bootstrap 轮播插件
  18. 简易计算器(C语言实现)
  19. php技术创新:利用动态404页面实现全站自动静态化
  20. 前端面试题总结【持续更新···】

热门文章

  1. 面向对象设计 腾讯代码案例 学习人家的模式和格式
  2. 190420每日一句
  3. 190329每日一句
  4. Python 和 C++实现 九九乘法表
  5. Atitit 嵌入式tomcat 嵌入式服务器 attilax 你感觉艾提拉 总结 比起嵌入jetty ,文件可以自动刷新貌似还不错。。方便调试debug package com.attilax.
  6. Atitit osi tcp ip 对应attilax总结
  7. Atitit数据库层次架构表与知识点 attilax 总结
  8. 自动化设置chrome禁止显示图片及恢复
  9. paip.提升用户体验----解决浏览器关闭后自动退出的问题
  10. paip.提升用户体验---上传文件图片命名