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();
到这里爬参数的数据基本就做完了,代码核心部分都写全了,还有些没有写,比如输入什么的,还有异常处理也没有写,这个学习者自己去学习,然后可以看到我的代码基本都没有注释,其实是有的,我在这里面都删掉了,就是希望大家自己多查资料学习,我自己也只是个学习者,希望本篇文章能对各位有帮助。
- Java爬虫--页面跳转爬数据
- java页面跳转到后台数据中文乱码问题
- 页面定时跳转 java
- java页面跳转
- <JAVA EE>页面跳转
- JAVA页面跳转
- 页面登录跳转获取数据
- 页面跳转与数据传递
- 页面跳转和数据传递
- 页面跳转并传递数据
- 页面跳转和数据传递
- vue 页面跳转,传数据
- Python爬虫之爬取动态页面数据
- 【爬虫初级】爬取百度百科静态页面数据案例
- Python爬虫之爬取动态页面数据
- java爬虫绕过登录页面
- 显示一个java跳转页面
- java jsp 实现页面跳转
- javaScript实现小球碰撞
- git学习3
- 合法IP地址的判断、关于给定字符串,求最大不重复子串 -- JAVA 算法题
- 【快搭】springboot+jsp
- (二)UI Automator测试项目的建立
- Java爬虫--页面跳转爬数据
- HDU5492 Find a path (动态规划)
- MySQL查询表格内容基本语句1
- kafka 安装和使用测试(mac版)
- PAT (Basic Level) Practise (中文)1010. 一元多项式求导 (25)
- Hadoop之MapReduce调度:通过shell进行多日期的串行跑批统计
- json版的轮播图
- Html中行内元素有哪些?块级元素有哪些?
- socket与http的区别