V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tiRolin
V2EX  ›  Java

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

  •  
  •   tiRolin · 338 天前 · 1529 次点击
    这是一个创建于 338 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    元素定位找 XPath 教程,再了解几个常见的 ExpectedConditions 就够了,实在不行还能像 2 楼那样直接右键复制。
    rqxiao
        5
    rqxiao  
       338 天前
    @tiRolin 可以找到固定的列表元素,有办法获得它的儿子节点
    fank99
        6
    fank99  
       338 天前
    @tiRolin 定位这个列表,然后遍历这个列表后继续在这个基础上解析。不明白的话,看看 scrapy 的 selector 怎么处理的。和一楼一样,我也建议使用 Python 。
    tiRolin
        7
    tiRolin  
    OP
       338 天前
    @rqxiao 像这样吗?
    for (int i = 0; i < elements.size(); i++) {
    elements.get(i).findElement(By.xpath("//复制来的 xpath 路径"));
    //此处进行业务逻辑
    }
    elements 指的是元素的集合
    krixaar
        8
    krixaar  
       338 天前
    @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
        9
    mgLSSKozL359  
       338 天前
    我就是用 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
        10
    jorneyr  
       338 天前
    推荐使用 Jsoup
    luzihang
        11
    luzihang  
       337 天前
    元素定位看经验的。考虑网页未来可能出现的情况,尽量通过父子节点+文字含义定位。比如:'//label[contains(text(), "信用代码")]/following-sibling::input/@value'
    ccw4wcc
        12
    ccw4wcc  
       337 天前
    webmagic
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2017 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:17 · PVG 00:17 · LAX 09:17 · JFK 12:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.