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的返回值自动进行各种序列化处理(序列化为 ...
随机推荐
- Java8获取参数名及Idea/Eclipse/Maven配置
在Java8之前,代码编译为class文件后,方法参数的类型固定,但是方法名称会丢失,方法名称会变成arg0.arg1.....而现在,在Java8开始可以在class文件中保留参数名,这就给反射带来 ...
- ITFriend创业败局(五):创业可以停止,公司必须注销,不然后果很严重
马上又要继续出来创业做事了,想到要注册公司,有个麻烦事. 事情得回到2014年9月. 当时,由于各种因素,决定放弃ITFriend,当然也放弃了原来了公司.先是,咨询了横德瑞的陈总,关于公司注销的事. ...
- [Redux] Avoid action type naming conflicts
In redux, the action type is just a normal string type, it is easy to get naming conflicts in large ...
- Android Studio 连接自己搭建的server 须要admin 的帐号的问题 SSH Password Login,please enter password for user git@git.
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- iOS项目中所有icon的尺寸以及命名
一般icon以下几个: Icon.png – 57×57 iPhone (ios5/6) Icon@2x.png – 114×114 iPhone Retina (ios5/6) Icon-72.pn ...
- C#生成二维码,把二维码图片放入Excel中
/// <summary> /// 把图片保存到excel中 /// </summary> /// <param name="excelFilePath&quo ...
- 推荐一款软件mybatis-generator-gui
https://github.com/zouzg/mybatis-generator-gui mybatis-generator-gui mybatis-generator-gui是基于mybatis ...
- kindeditor 4 上传下载文件
jsp代码 1 <script type="text/javascript" src="${pageContext.request.contextPath}/kin ...
- 【Codeforces Round #438 C】 Qualification Rounds
[链接]h在这里写链接 [题意] 给你n个问题,每个人都知道一些问题. 然后让你选择一些问题,使得每个人知道的问题的数量,不超过这些问题的数量的一半. [题解] 想法题. 只要有两个问题. 这两个问题 ...
- WPF 高速书写 StylusPlugIn 原理
原文:WPF 高速书写 StylusPlugIn 原理 本文告诉大家 WPF 的 StylusPlugIn 为什么能做高性能书写,在我的上一篇博客和大家介绍了 WPF 的触摸原理,但是没有详细告诉大家 ...