Java爬虫--页面跳转爬数据

来源:互联网 发布:大数据主要来源于哪些 编辑:程序博客网 时间:2024/05/22 17:20

刚来老板(导师)公司实习,接到任务是用java做一个爬虫,来搜索中关村中手机的参数,功能是输入一个关键字,然后可以输出相关手机的CPU型号,操作系统,蓝牙版本。比如:输入s6,就要输出s6手机的相关参数。
嗯,我还不怎么会Java语言,借这个机会可以好好学学,就是这样!下面开始学习吧…
首先需要搞清楚需求是什么,先把过程模拟一遍,就不上图了,自己脑补一下,首先在百度主页面中输入关键字s6,然后需要有页面跳转到搜索结果,然后找到结果相关手机的链接,再跳转到相关手机的页面,接着需要跳转到参数的页面,然后逐一提取相关数据。
网上找了很多教程,好像都没有页面跳转的学习方法。然后还要说的是大家最好有html相关的知识,不会的可以去w3c里面看看。我试过用RULConnection和Jsoup方法,好像都不适用,可能是对于这个网站不适用,中关村搜索出来的页面好像不能直接跳转,尝试多次失败后我最后找到了HTMLUnitDriver类库,这个类库很好用,网上也有相应的jar包,大家自行去下载,相关的学习也可以自己去深入学习。下面开始讲解编码。
首先,在网页上模拟输入关键字必须先找到输入框,打开审查元素(各浏览器名称不一样),找到输入框的位置。
这里写图片描述
输入框的id是kw,然后再找到百度一下按钮的id是su,那么我们就可以模拟在输入框中输入关键字,然后点击百度一下按钮进行搜索。代码如下:

        WebDriver driver = new HtmlUnitDriver();         String url = "https://www.baidu.com/";        driver.get(url);        driver.findElement(By.id("kw")).sendKeys(keyword);        driver.findElement(By.id("su")).click();

这里的keyword是自己输入的参数,代码中没写全,搜索后的页面应该是这样的:
这里写图片描述

接下来就应该进入那个中关村在线的链接里面,这里通过链接文字就可以找到这个链接再进入了,代码如下:

WebElement href =driver.findElement(By.partialLinkText("中关村在线"));String href_s = href.getAttribute("href");driver.get(href_s);

partialLinkText()函数是匹配部分链接文字,这里driver到达了中关村的页面了,图片如下:
这里写图片描述

然后需要点击到参数那个table,可以再审查元素,找到参数的链接地址,如图:

这里写图片描述
继续跳转到找到的这个链接页面,代码如下:

String href_can =driver.findElement(By.partialLinkText("参数")).getAttribute("href");driver.get(href_can);

跳转到目的页面之后,就要开始提取目的的数据了。依然是要看网页源码的,图片如下:
这里写图片描述
可以看到参数数据都是放在这个id叫做newTb的div里面,所以我们需要找到这个div元素。然后要找具体的数据,以操作系统为例,先看一下操作系统的相关源码,图片如下:
这里写图片描述
源码中可以看到,参数每一行数据都是放在一个li里面的,可恶的是这个li没有id值也没有class值,这可能是网站做了反爬虫设计,然后下面的span都有id值,但是这个值怎么也获取不到,百度了一下说是这个id是动态的,不能获取到固定值,那要怎么办,我想了一个办法,就是先获取到这所有的li,然后再找每个li下面的span里面有没有操作系统相关的关键字可以匹配的,如果有,就把把这个li里面的所有文本输出出来,代码如下:

WebElement tb = driver.findElement(By.id("newTb"));List<WebElement> list = tb.findElements(By.tagName("li"));for(WebElement e : list) {    if(e.getText() == "") {    }else {        List<WebElement> spans = e.findElements(By.tagName("span"));        boolean tag = false;    for(WebElement span : spans) {        String str = span.getText();        Pattern pattern = Pattern.compile("([Ii][Oo][Ss][ ][0-9]+)|([A][n][d][r][o][i][d][ ][0-9]+)|([C][P][U])|([W][L][A][N])");        Matcher matcher = pattern.matcher(str);        if(matcher.find()) {            tag = true;break;        }    }    if(tag) {        for(WebElement span : spans) {            System.out.println(span.getText());        }    }            }

上面的代码中用到了简单的正则表达式,不懂得童鞋可以自己去学习一下,以后都很有用的。别忘了最后还需要停止driver。代码是:

driver.quit();

到这里爬参数的数据基本就做完了,代码核心部分都写全了,还有些没有写,比如输入什么的,还有异常处理也没有写,这个学习者自己去学习,然后可以看到我的代码基本都没有注释,其实是有的,我在这里面都删掉了,就是希望大家自己多查资料学习,我自己也只是个学习者,希望本篇文章能对各位有帮助。

原创粉丝点击