Java 做爬虫怎么学习元素定位?有没有教程或者方法指点一二?

2023-04-25 17:05:09 +08:00
 tiRolin

最近用 selenium 做 Java 爬虫,虽然可以爬取到页面了,但是在元素定位上犯了难

我可以通过爬虫获取一个列表的所有元素遍历文本,但是不知道怎么精确定位到对应属性或者元素上获取文本内容,去网上看了挺久的教程也没整明白怎么做好,就我知道里面有提供什么方法,但是我却不知道具体怎么使用,或者是我按我的想法来测试往往都是得不到结果,尤其是里面有很多元素嵌套的时候,感觉自己根本无从下手

所以我就是想来问问各位,是怎么学习元素定位的,有没有学习的方法或者什么教程推荐一下,我想尽快上手然后做爬虫,先谢谢各位了

1574 次点击
所在节点    Java
12 条回复
ospider
2023-04-25 17:06:40 +08:00
爬虫还是建议 Python ,你实在讨厌 Python 用 Go 也行。不是说 Java 不好,没那个生态,你非要搞的话,事倍功半。
rqxiao
2023-04-25 17:14:02 +08:00
浏览器 F12->Elements->选中元素右键->Copy xpath, Copy js path ,Copyxxxxxxxx
tiRolin
2023-04-25 17:16:09 +08:00
@rqxiao 这个我学长也教我这么用,但是对于一个列表来说,他的 Xpath 不是会随着列表变化一直增加的吗?这样的话写出来的代码还具有通用性吗?还是说干脆来个 for 循环自己拼接 Xpath 语句?
krixaar
2023-04-25 17:18:20 +08:00
@ospider #1 用 selenium 哪个语言无所谓吧,api 都一样。

元素定位找 XPath 教程,再了解几个常见的 ExpectedConditions 就够了,实在不行还能像 2 楼那样直接右键复制。
rqxiao
2023-04-25 17:20:29 +08:00
@tiRolin 可以找到固定的列表元素,有办法获得它的儿子节点
fank99
2023-04-25 17:22:47 +08:00
@tiRolin 定位这个列表,然后遍历这个列表后继续在这个基础上解析。不明白的话,看看 scrapy 的 selector 怎么处理的。和一楼一样,我也建议使用 Python 。
tiRolin
2023-04-25 17:26:58 +08:00
@rqxiao 像这样吗?
for (int i = 0; i < elements.size(); i++) {
elements.get(i).findElement(By.xpath("//复制来的 xpath 路径"));
//此处进行业务逻辑
}
elements 指的是元素的集合
krixaar
2023-04-25 17:30:45 +08:00
@tiRolin #3 XPath 是可以一次性返回所有符合条件元素的,比如某个 ul 或者 ol 下面的所有 li ,在 Selenium 对应的就是 findelements by.xpath ,//ul[@id="xxx"]//li ,取下来的就是所有的 li 元素,一个 for 循环取数据就行了。
甚至,你直接在这个页面 F12 ,然后控制台敲 $x('//div[@class="reply_content flod"]') 都能把所有的回复的 div 给选出来。
mgLSSKozL359
2023-04-25 17:32:22 +08:00
我就是用 java 的。用了 Jsoup 。和传统的 jquery 差不多。反正就是通过各种选择器定位元素。

附上 pom 和示例代码:

<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>

String html = EntityUtils.toString(response.getEntity(), "UTF-8").replace("&nbsp;", " ");
Document document = Jsoup.parse(html);
List<Element> trs = document.selectFirst("[class=onbuildshow]").selectFirst("[class=onbuildshow_contant colordg ft14]").selectFirst("[class=sjtd]").select("tr");
jorneyr
2023-04-25 17:37:45 +08:00
推荐使用 Jsoup
luzihang
2023-04-26 11:00:05 +08:00
元素定位看经验的。考虑网页未来可能出现的情况,尽量通过父子节点+文字含义定位。比如:'//label[contains(text(), "信用代码")]/following-sibling::input/@value'
ccw4wcc
2023-04-26 11:04:39 +08:00
webmagic

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/935412

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX