Java爬虫在获取最新页面信息时,难免会用到模拟点击某些按钮来刷新页面,然后获取到页面信息,简单的情况就不说了,说说笔者最近做的一些爬虫时遇到的问题和解决方案吧,估计这些你们都用得到。
一、建设银行爬虫-爬取收款信息
问题:
当IE驱动拉起建设银行登录页面我们登录后需要跳转到交易明细,这时问题来了。模拟点击明细时,建设银行官网弹出了个新的窗口,那么怎么获取新窗口上面的html页面呢?
解决方案:
窗口切换,直接上代码
//TODO 窗口切换
if(ifonce) {
//打印并获取当前窗口网址(刚登陆上的页面不是我们需要的)
System.out.println("URL1:" + driver.getCurrentUrl());
String url1=driver.getCurrentUrl();
//获取当前所以窗口的网址
Set winHandels = driver.getWindowHandles();
List it = new ArrayList(winHandels);
//跳转list第一个网址
driver.switchTo().window((String) it.get(0));
Thread.sleep(1000);
//判断这个网址是不是刚登陆上的官网地址
if(driver.getCurrentUrl().equals(url1)){
//跳转到另一个网址(如果第一个网址不是,那么第二个肯定是了对吧)
driver.switchTo().window((String) it.get(1));
}
System.out.println("URL2:" + driver.getCurrentUrl());
//切换窗口后我们之后就在这个窗口刷新获取数据就行了,所以把这个标签设为false
ifonce=false;
}
二、拼多多爬虫 -爬取商家订单信息
问题:
如图:首先我们需要更新网址(因为一次性选择条件好只点击刷新,最新数据刷新不出来)然后订单状态选择全部,接着拼单成功时间选择24小时内,最后点刷新。难点,我们需要先点一下边框,弹出下拉列表才能选择条件,而且这几个的class都一样没有唯一标识。
解决方案:
先找到第几个class,然后找到唯一标识。直接上代码
while (notInterrupted) {
System.out.println("***************************正在抓取数据:第"+(count++)+"次*******************************");
//待发货订单
driver.navigate().refresh();
//全部订单
//默认第一个class
WebElement e = driver.findElement(By.className("pdd-dui-select-text"));
e.click();
Thread.sleep(2800);
//默认第一个class
WebElement element = driver.findElement(By.className("pdd-dui-options-wrap"));
element.findElement(By.partialLinkText("全部")).click();
Thread.sleep(1000);
//帅选售后
// driver.findElements(By.className("pdd-dui-select-text")).get(1).click();
// Thread.sleep(2800);
// WebElement we=driver.findElements(By.className("pdd-dui-options-wrap")).get(1);
// we.findElement(By.partialLinkText("全部")).click();
// Thread.sleep(1000);
//查找时间
//我们获取从上到下第5个class点击弹出下拉表单然后然后在选择点击最近24小时还是其他时间
driver.findElements(By.className("pdd-dui-select-text")).get(4).click();
Thread.sleep(2800);
WebElement webE=driver.findElements(By.className("pdd-dui-options-wrap")).get(4);
//webE.findElement(By.partialLinkText("最近24小时内")).click();
webE.findElement(By.partialLinkText("最近7天内")).click();
//点击查询
Thread.sleep(2000);
//这里有唯一的class当然最好
WebElement ele = driver.findElement(By.className("ez-75"));
ele.findElement(By.partialLinkText("查询")).click();
// 补单
// Thread.sleep(1000);
// WebElement webElement=driver.findElement(By.className("pdd-pagination"));
// webElement.findElement(By.partialLinkText(String.valueOf(budan))).click();
// if(budan<=5){
// budan++;
// }else {
// budan=1;
// }
Thread.sleep(500);
String data = driver.getPageSource();
//System.out.println(data);
task.initial(data);
threadPool.submit(task);
//除去上面已睡眠的3s
Thread.sleep(DataProcessor.getTimeInterval() * 1000 - 3000);
}
三、数据解析
数据解析需要大家用好正则表达式,推荐地址:
https://blog.csdn.net/Z_Vivian/article/details/89295118
问题:
selenium click点击无反应问题解析
解决方案:
使用js脚本点击元素
WebElement el = driver.findElement(By.className("index-mod__checkbox___3mesI"));
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click();",el);