selenium + ChromeDriver 实战系列之启信宝(一)
1. 友情链接
2. 爬取思路及流程
2.1 点击登录
//去登陆页面并且登录
public static void toLoginAndLogin(WebDriver driver) {
//1、去登陆页面
List<WebElement> elements = driver.findElements(By.cssSelector("div.pull-right a"));
//2、通过下标得到对应的登录链接
WebElement loginElement = elements.get(elements.size() - 1);
loginElement.click();
//2、该方法判断当前页面是登录页面,则进行登录
CompanyInfoPageHandle.handleDifferentPage(driver);
}
2.2 搜索公司
//查询公司名称
public static void searchCompanyName(WebDriver driver, String CompanyName) {
//1、查询公司名称
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//2、选取输入框
WebElement search = driver.findElement(By.cssSelector("input[placeholder=\"请输入企业名、人名、产品名等关键词,多关键词用空格隔开,如:上海 平安\"]"));
search.sendKeys(CompanyName);
//3、选取按钮
WebElement submit = driver.findElement(By.cssSelector("i.input-group-addon.search-btn.icon.icon-search"));
submit.click();
//4、判断当前页面的情况并进行处理
CompanyInfoPageHandle.handleDifferentPage(driver);
}
2.3 爬取当前数据
/**
* 保存信息
* @param driver
* @param companyName
*/
private void saveResult(WebDriver driver, String companyName) {
try {
Thread.sleep(2000);
//1、首先遍历每行的公司信息
List<WebElement> companyElementList = driver.findElements(By.cssSelector("div.col-xs-24.padding-v-1x.margin-0-0x.border-b-b4.company-item"));
//2、保存当前一行公司的信息
for (WebElement companyElement : companyElementList) {//保存信息
try {
List<WebElement> companyInfoElementList = companyElement.findElements(By.cssSelector("div"));
List<String> infoList = new ArrayList<>();
for (WebElement companyInfo : companyInfoElementList) {
infoList.add(companyInfo.getText().replace("\n", ""));
}
String result = String.join("\t", infoList);
FileUtils.saveLineAppend(companyName + ".txt", result);
} catch (Exception e) {
continue;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
2.4 页面判断及处理
/**
* 用来判别页面的情况
*/
public class CompanyInfoPageClassification {
/**
* 页面判断的主方法,用来判断当前的页面是什么页面
* @param driver
* @return
*/
public static String PageClassificationMain(WebDriver driver){
if (isVerificationCodePage(driver)){
return "验证码";
}
if (is404Page(driver)){
return "404";
}
if (isLoginPage(driver)){
return "登录";
}
return "正常";
}
/**
* 判断当前页面是否是验证码页面
* @param driver
* @return
*/
private static boolean isVerificationCodePage(WebDriver driver){
List<WebElement> buttonList = driver.findElements(By.cssSelector("button.btn4"));
if (buttonList.size() != 0 && buttonList.get(0).getText().equals("点击按钮进行验证")) {
return true;
} else {
return false;
}
}
/**
* 判断当前页面是否是404
* @param driver
* @return
*/
private static boolean is404Page(WebDriver driver){
List<WebElement> buttonList = driver.findElements(By.cssSelector("div.error-container.error-404"));
if (buttonList.size() != 0 ) {
return true;
} else {
return false;
}
}
/**
* 判断当前页面是否是登录页面
* @param driver
* @return
*/
private static boolean isLoginPage(WebDriver driver){
List<WebElement> buttonList = driver.findElements(By.cssSelector("input[placeholder=\"请输入手机号码\"]"));
if (buttonList.size() != 0 ) {
return true;
} else {
return false;
}
}
}
**
* 根据不同的页面进行不同的处理
*/
public class CompanyInfoPageHandle {
public static void handleDifferentPage(WebDriver driver){
try {
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
String pageStatus = CompanyInfoPageClassification.PageClassificationMain(driver);
switch (pageStatus){
case "验证码":
//1、如果是验证码页面那么需要在这里进行处理,例如手动输入验证码。如果验证码比较简单可以使用字符识别的方法
System.out.println("验证码页面");
//2、登录完了之后再判断是什么页面,然后再对当前页面进行处理
handleDifferentPage(driver);
break;
case "登录":
//1、如果是登录页面那就进行登录
login(driver, "用户名","密码");
//2、登录完了之后再判断是什么页面,然后再对当前页面进行处理
handleDifferentPage(driver);
break;
case "404":
break; }
} private static void login(WebDriver driver, String userName, String password){
WebElement phoneElement = driver.findElement(By.cssSelector("input[placeholder=\"请输入手机号码\"]"));
phoneElement.sendKeys(userName);
WebElement passwordElement = driver.findElement(By.cssSelector("input[placeholder=\"请输入密码\"]"));
passwordElement.sendKeys(password);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
List<WebElement> elements2 = driver.findElements(By.cssSelector("div a.btn"));
WebElement login = elements2.get(0);
login.click();
}
}
3. github地址并总结经验
<li><a href="/example" data-marko="{"onclick":"handleClickDebounce s0-9-20 false 0"}">2</a></li>
selenium + ChromeDriver 实战系列之启信宝(一)的更多相关文章
- requests,lxml爬启信宝
首先, 添加requests模块: 然后, 添加lxml模块: 启信宝登录抓包: QiXinBao.py: import requestsfrom lxml import etree loginUrl ...
- Spark入门实战系列--9.Spark图计算GraphX介绍及实例
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理 ...
- Spark入门实战系列--1.Spark及其生态圈简介
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...
- AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码
AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型 . AspNetCore-MVC实战系列(二)之 ...
- SQL Server 性能优化实战系列(二)
SQL Server datetime数据类型设计.优化误区 一.场景 在SQL Server 2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你 ...
- .net core实践系列之短信服务-为什么选择.net core(开篇)
前言 从今天我将会写.net core实战系列,以我最近完成的短信服务作为例子.该系列将会尽量以最短的时间全部发布出来.源码也将优先开源出来给大家. 源码地址:https://github.com/S ...
- Java工程师之Redis实战系列教程前言&目录
系列前言 Java工程师之Redis实战系列教程,同其他教程一样,均是在下学习笔记,本系列主要参考自<Redis-in-action>,将书本中的有趣的例子转化为能解决特定问题的示例程序, ...
- [转]微信小程序之加载更多(分页加载)实例 —— 微信小程序实战系列(2)
本文转自;http://blog.csdn.net/michael_ouyang/article/details/56846185 loadmore 加载更多(分页加载) 当用户打开一个页面时,假设后 ...
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...
随机推荐
- 新版Sublime text3注册码被移除的解决办法
Sublime Text是风靡世界的文本编辑器,支持多种编程语言,启动时间短,打开文件速度快,插件丰富,让很多程序员爱不释手.但是,对于未注册的Sublime Text, 经常在保存的时候会弹出一个烦 ...
- @RequiresPermissions 解释
@RequiresAuthentication 验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时. @RequiresUser 验证用户是否被记忆,us ...
- 前端css实现最基本的时间轴
原型: 图片.png 代码: <!DOCTYPE html > <html> <head> <link rel="stylesheet" ...
- JSP和Servlet学习笔记1 - 访问配置
1. 访问 WebContent 目录下的 JSP 文件 在 WebContent 目录下的文件可以直接在浏览器中访问.新建一个 test.jsp 文件 <%@ page language=&q ...
- java做微信支付notify_url异步通知服务端的写法
最近团队在接入微信支付,APP和JSAPI的接口都需要填写一个notify_url回调地址,但是坑爹的官方文档并没有找到JSAPI模式的java版的demo,所以不得不自己看文档写了一个接受微信异步通 ...
- Step-By-Step Installation of RAC with RAW Datafiles on Windows 2000
Step-By-Step Installation of RAC with RAW Datafiles on Windows 2000 Purpose This document will pr ...
- android游戏开发系列(1)——迅雷不及掩耳的声音
这种声音是短而快的声音,应该采用android.media.SoundPool实现. SoundPool的特点: 1. SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作.但是这 ...
- C++一个简单的手柄类模板
#ifndef HANDLE_H #define HANDLE_H #include "Animal.h" template <typename T> class Ha ...
- PFIF网上寻人协议
原文:http://www.csdn.net/article/2013-04-22/2814980 本文的主要内容来自Wikipedia(http://en.wikipedia.org/wiki/Pe ...
- chaos —— 混沌
混沌,一个被严重滥用的物理数学概念. 混沌(chaos)是一个动力学系统(Dynamic System)概念,指的是确定性动力学系统因对初值敏感而表现出的不可预测的.类似随机性的运动. 1. 洛伦兹吸 ...