基于Java的阿里妈妈数据抓取技术

article/2025/5/9 1:01:28

基于Java的阿里妈妈数据抓取技术

前言:

    对于需要登录的网站爬虫最大的困难就是需要登录,然后才能获取到数据,如微博,阿里妈妈,webqq等。之前也有看过使用浏览器登录到网站后直接从浏览器中获取cookie的文章,这不失为一种解决方案,但是当cookie失效时就需要再次获取,比较麻烦,那有没有能有自动登录,然后在爬取数据的技术呢,这就是本文研究的重点,好啦不扯淡了,开始进入正题吧。

技术要点:java + Phantomjs+httpclient

思路:

     1.需要借助一些工具获取登录的cookie,在做后续操作,这里就使用phantomjs来获取,其实phantomjs就是一个没有界面的浏览器,它提供了一些js的接口操作该浏览器,http://phantomjs.org/download.html这个链接就是该浏览器的链接,大家需要可以在这里下载。

2.由于phantom也可以直接发送postget请求,但是解析起来比较慢,所以这里就只是在登录时使用该插件来获取cookie然后使用Javahttpclient来发送请求获取数据。

 

引入maven库:

<!-- https://mvnrepository.com/artifact/htmlunit/htmlunit -->

<dependency>

<groupId>net.sourceforge.htmlunit</groupId>

<artifactId>htmlunit</artifactId>

<version>2.15</version>

</dependency>

<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpclient</artifactId>

<version>4.5.4</version>

</dependency>

<dependency>

<groupId>org.seleniumhq.selenium</groupId>

<artifactId>selenium-java</artifactId>

<version>2.53.0</version>

</dependency>

<dependency>

<groupId>com.codeborne</groupId>

<artifactId>phantomjsdriver</artifactId>

<version>1.2.1</version>

<exclusions>

<exclusion>

<groupId>org.seleniumhq.selenium</groupId>

<artifactId>selenium-remote-driver</artifactId>

</exclusion>

<exclusion>

<groupId>org.seleniumhq.selenium</groupId>

<artifactId>selenium-java</artifactId>

</exclusion>

</exclusions>

</dependency>

编写页面处理的工具类

/***

 * 页面操作的工具类

 *

 * @author admin

 *

 */

public class PageUtils {

public static PhantomJSDriver driver = null;

public static String PhantomPath = "E:/phantomjs/bin/phantomjs.exe";

//页面中的cookie

public static Set<Cookie>cookies=null;

//页面中的token

public static String token=null;

// 初始化phantom先关的操作

static {

// 设置必要参数

DesiredCapabilities dcaps = new DesiredCapabilities();

// ssl证书支持

dcaps.setCapability("acceptSslCerts", true);

// 截屏支持

dcaps.setCapability("takesScreenshot", true);

// css搜索支持

dcaps.setCapability("cssSelectorsEnabled", true);

// js支持

dcaps.setJavascriptEnabled(true);

// 驱动支持

dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, PhantomPath);

// 创建无界面浏览器对象

driver = new PhantomJSDriver(dcaps);

}

 

public static boolean loadLogin(String loginUrl, String mainUrl) throws Exception {

try {

driver.get(loginUrl);

File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

File file = new File("baidu_selenium.png");

FileUtils.copyFile(scrFile, file);

System.out.println("二维码已经保存为:" + file.getAbsolutePath());

System.out.println("请打开淘宝扫描该图片登录");

String current = "";

while (!current.equals(mainUrl)) {

current = driver.getCurrentUrl();

Thread.sleep(2000);

}

System.out.println("登录成功");

return true;

} catch (Exception e) {

//当出现异常时关闭

//driver.close();

//driver.quit();

return false;

}

}

//开启一个线程,定时访问页面,防止页面太久没有操作导致session超时

public static void keepCookies() {

new Thread() {

public void run() {

//淘宝联盟页面

String url="http://pub.alimama.com/myunion.htm";

while(true) {

try {

driver.get(url);

cookies=driver.manage().getCookies();

Thread.sleep(8*1000);

} catch (InterruptedException e) {

}

}

};

}.start();

}

//获取token

public static String getToken() {

//等待cookie中有数据

while(cookies==null) {

try {

Thread.sleep(1*1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

for(Cookie cook:cookies) {

String name=cook.getName();

if(name!=null&&name.equals("_tb_token_")) {

return token= cook.getValue();

}

}

return token;

}

/**

 * 封装get请求

 * @param url

 * @return

 */

public static String httpGet(String url) {

try {

//获取cookie字符串

String cookieStr="";

for(Cookie cookie:cookies) {

cookieStr+=cookie.getName()+"="+cookie.getValue()+";";

}

// 根据地址获取请求

            HttpGet request = new HttpGet(url);//这里发送get请求

            //添加请求头

            request.addHeader("Pragma", "no-cache");

            //设置浏览器类型

            request.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1");

            request.addHeader("Accept-Language", "zh-CN,en,*");

            //设置cookie

            request.addHeader("Cookie", cookieStr);

            // 获取当前客户端对象

            HttpClient  httpClient = HttpClients.custom().build();

            // 通过请求对象获取响应对象

            HttpResponse response = httpClient.execute(request);

            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

                return EntityUtils.toString(response.getEntity(),"utf-8");

            }

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

 * 封装post请求

 * @param url

 * @return

 */

public static String httpPost(String url) {

 

try {

//获取cookie字符串

String cookieStr="";

for(Cookie cookie:cookies) {

cookieStr+=cookie.getName()+"="+cookie.getValue()+";";

}

// 根据地址获取请求

            HttpPost request = new HttpPost(url);//这里发送get请求

            //添加请求头

            request.addHeader("Pragma", "no-cache");

            //设置浏览器类型

            request.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1");

            request.addHeader("Accept-Language", "zh-CN,en,*");

            //设置cookie

            request.addHeader("Cookie", cookieStr);

            // 获取当前客户端对象

            HttpClient  httpClient = HttpClients.custom().build();

            // 通过请求对象获取响应对象

            HttpResponse response = httpClient.execute(request);

            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

                return EntityUtils.toString(response.getEntity(),"utf-8");

            }

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

 * 获取导购推广位

 * @param time

 * @param pvid

 * @param token

 * @return

 */

public static String getShoppingGuide(String pvid,String token) {

String url="https://pub.alimama.com/common/adzone/adzoneManage.json?"

+ "spm=a219t.7900221/1.1998910419.dbb742793.5bcb8cdcYsmdCb&"

+ "tab=3&"

+ "toPage=1&"

+ "perPageSize=40&"

+ "gcid=8&"

+ "t="+getCirrentTime()+"&"

+ "pvid="+pvid+"&"

//"pvid=60_59.172.110.203_862_1517744052508&"

+ "_tb_token_="+token+"&"

+ "_input_charset=utf-8";

return httpGet(url);

}

//获取当前的时间戳

public static long getCirrentTime() {

return System.currentTimeMillis();

}

/**

 * 获取1000以内的随机数

 * @return

 */

public static int getRandom() {

Random random=new Random();

int result=(int)(random.nextFloat()*1000);

return result;

}

}

 

编写主类:

public class Test {

public static Gson gson=new Gson();

public static void main(String[] args) {

//阿里妈妈录页面

String taobao="https://login.taobao.com/member/login.jhtml?style=mini&newMini2=true&css_style=alimama_index&from=alimama&redirectURL=http://www.alimama.com&full_redirect=true&disableQuickLogin=true";

//阿里妈妈主页面

String loginUrl="https://www.alimama.com/index.htm";

//获取个人信息的接口

String userUrl="http://pub.alimama.com/common/getUnionPubContextInfo.json";

try {

PageUtils.loadLogin(taobao, loginUrl);

PageUtils.keepCookies();

String token=PageUtils.getToken();

System.out.println("token:"+token);

String result=PageUtils.httpGet(userUrl);

LoginInfo info=gson.fromJson(result, LoginInfo.class);

System.out.println("获取个人信息:"+info);

//格式60_59.172.110.203_862_1517744052508

String pvid="60"

+"_"+info.getData().getIp()

+"_"+PageUtils.getRandom()

+"_"+PageUtils.getCirrentTime();

//获取导购推广位

String shopping=PageUtils.getShoppingGuide(pvid,PageUtils.getToken());

System.out.println("导购位信息:"+shopping);

} catch (Exception e) {

e.printStackTrace();

}

}

效果展示:


总结:通过本次爬虫也对httpcookie有了一定的了解,同时一些细节没有直接展示出来,但是代码中会有对一些躺过的坑作出解释,希望能够帮助到大家。


http://chatgpt.dhexx.cn/article/KhrPv0Ir.shtml

相关文章

uni-app中引入iconfont阿里巴巴矢量图标库

一&#xff1a;首先看一下图标 二&#xff1a;将icon.css文件放到项目中。 在static下面新建icon.css文件&#xff08;一般是建在common文件下面&#xff0c;建在其他位置上也可以&#xff09;&#xff0c;将iconfont里面的内容复制到icon.css。 这里要对icon.css内容做一些改变…

引入阿里iconfont图标方法以及注意事项

背景 在我们做日常项目时&#xff0c;通常会用到icon图标或者是一些图标字体&#xff0c;阿里iconfont是我们选择的较多的一种&#xff0c;下面我将会介绍使用方法和几种常用的引用方式 iconfont新建项目 官网&#xff1a;https://www.iconfont.cn/ 在首页选择【图标管理】-…

如何在代码里添加并使用阿里巴巴矢量图标-iconfont,在此常用有三种引入方法

iconfont-阿里巴巴矢量图库 在登录好账号的前提下进行以下操作&#xff1a; 添加icon&#xff1a; 首先搜索你想要的icon名&#xff0c;比如&#xff1a;首页选好你想要的图——加入购物车——添加至项目&#xff08;没有项目的话可以新建项目&#xff0c;如果需要很多icon&a…

阿里巴巴icon图标尽在掌握(前端如何引入icon库,美丽图标随你处置T.T)

前端如何引入icon库 挑选图标1.进入阿里矢量图标库[iconfont图标库地址](https://www.iconfont.cn/)2.寻找自己需要的图标加入购物车3.进入购物车&#xff0c;下载代码 引用图标我们先来看看下载的需要加入的css代码直接调用封装好的调用效果展示 挑选图标 1.进入阿里矢量图标…

项目中引入阿里巴巴图标——iconfont图标的使用-svg格式

项目中引入阿里巴巴图标——iconfont图标的使用-svg格式 一、下载图标 1、先进入iconfont.cn页面 iconfont官网&#xff1a;https://www.iconfont.cn/ 2、登陆&#xff0c;并选择你要用的图标进行下载 3、点击下载&#xff0c;并选择弹框下面的色值和大小&#xff0c;点击sv…

某Java大佬在地表最强Java企业(阿里)面试总结

面试题真的是博大精深&#xff0c;也通过这个面试题学到了很多东西&#xff0c;很多笔者也不是很懂&#xff0c;如有描述错误的地方还望大佬赐教&#xff0c; 每一次面试都可能问到相同的问题&#xff0c;一面问到&#xff0c;二三面还可能会问到&#xff0c;笔者认为这一点是整…

阿里图标库中图标的下载使用

一 iconfont-阿里巴巴矢量图标库 进去找到你想要的图标 二 点这个 三 点这个 点这个 新建自己的项目 选择这个点下载 解压出来&#xff0c;除了两个demo不要都添加到你的代码中的文件夹保存 四 main.js中全局导入 import ./xxxx/xxxx/iconfont.css 五 页面使用 <…

uniapp配置添加阿里巴巴图标icon流程步骤

文章目录 下载复制文件到项目文件夹里项目配置目录结构显示图标 下载 阿里巴巴icon官网 https://www.iconfont.cn/ 复制文件到项目文件夹里 项目配置目录结构 显示图标

阿里妈妈iconfont矢量图标的使用方法(超详细)

iconfont使用方法 1.为什么要使用iconfont&#xff1f; 之前我们一直使用的是雪碧图&#xff0c;虽然好用&#xff0c;但是也是有一定的限制的&#xff0c;比如说&#xff0c;你希望这个图标大一点&#xff0c;当然你也可以调节雪碧图的大小但是此时会出现图片不清楚的情况&am…

idea添加工作空间

1. 点击【File】&#xff0c;选择【Project Structure...】&#xff1b; 2. 点击【】&#xff0c;勾选对应项目&#xff1b;

IDEA工作空间修改

IDEA工作空间修改&#xff08;IDEA2020.1绿色免安装&#xff09;

IDEA开启后,设置工作空间位置

欢迎加群&#xff1a;854228077。 帮助更多java程序员提升技术&#xff01;资料多&#xff0c;大佬多&#xff01; 第一步:打开IDEA

IDEA更改工作空间及新建SpringBoot项目

IDEA更改工作空间其实很简单 直接新建一个SpringBoot项目举例 1、FIle——>new——>project 2、Spring initializr 3、随意 4、引入Spring Web依赖&#xff08;引不引皆可&#xff0c;后续可在POM文件中引入&#xff09; 5、唯一值得强调的地方 Project localtion&…

IDEA把多个项目放在同一个工作空间下

打开IntelliJ IDEA编译器&#xff0c;点击菜单 File->Open&#xff0c;选择工作空间根目录 点击OK后打开界面如下&#xff1a; 打开后&#xff0c;发现IDEA并没有自动识别Maven项目&#xff0c;这时候&#xff0c;需要手动在IDEA右侧的Maven Projects栏中添加项目的pom.xml文…

IntelliJ:idea取消启动时的默认工作空间,打开欢迎页面

由于习惯&#xff0c;当初打开IntelliJ&#xff1a;idea后&#xff0c;选择了不在提示欢迎页面&#xff0c;后续导致每次打开时想要打开不同的项目&#xff0c;需要在编辑器上重新选择打开的目录&#xff0c;比较麻烦&#xff0c;所有为了方便&#xff0c;移除进入默认工作空间…

idea 启动时怎么选择工作空间

idea 启动时怎么选择工作空间 按快捷键:ctrl alt s打开设置 点击System Settings选项后&#xff0c;把右边版面中Reopen last projecton startup前面的勾去掉&#xff0c;保存。下次再打开的时候就可以选择你要的空间了 点击File->Settings->点击System Settings选项后…

idea在一个工作空间同时打开多个项目

文章目录 效果展示&#xff1a;引入Maven工程引入本地工程注意&#xff1a;project structure idea也有workspace的概念&#xff0c;即工作空间。支持多个工程&#xff08;project&#xff09;在一个窗口显示&#xff0c;此时单个子工程叫做moudle&#xff08;模块&#xff09;…

eclipse切换工作空间

由于eclipse第一次打开的时候设置了工作空间&#xff0c;所以再次启动的时候就不会询问eclipse的工作空间怎么设置。可是我们有时需要通过eclipse知道工作空间的目录或者像重新设置工作空间。那么设置方法是&#xff1a;在eclipse中file---switch workspace --other 就可以重新…

IDEA更改工作空间及创建SpringBoot项目

IDEA创建工作空间及SpringBoot项目(更改工作空间在最底下)&#xff1a; 1、如果是第一次进入IDEA&#xff0c;在这个页面选择create new project&#xff1b; 然后就是选择工作空间的位置和命名 2、切记&#xff1a; 1&#xff09;IDEA里的project相当于eclipse的wordspace 2&a…