Java 做爬虫怎么学习元素定位?有没有教程或者方法指点一二? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tiRolin
V2EX    Java

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

  •  
  •   tiRolin 2023-04-25 17:05:09 +08:00 2239 次点击
    这是一个创建于 904 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    元素定位找 XPath 教程,再了解几个常见的 ExpectedConditions 就够了,实在不行还能像 2 楼那样直接右键复制。
    rqxiao
        5
    rqxiao  
       2023-04-25 17:20:29 +08:00
    @tiRolin 可以找到固定的列表元素,有办法获得它的儿子节点
    fank99
        6
    fank99  
       2023-04-25 17:22:47 +08:00
    @tiRolin 定位这个列表,然后遍历这个列表后继续在这个基础上解析。不明白的话,看看 scrapy 的 selector 怎么处理的。和一楼一样,我也建议使用 Python 。
    tiRolin
        7
    tiRolin  
    OP
       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
        8
    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
        9
    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
        10
    jorneyr  
       2023-04-25 17:37:45 +08:00
    推荐使用 Jsoup
    luzihang
        11
    luzihang  
       2023-04-26 11:00:05 +08:00
    元素定位看经验的。考虑网页未来可能出现的情况,尽量通过父子节点+文字含义定位。比如:'//label[contains(text(), "信用代码")]/following-sibling::input/@value'
    ccw4wcc
        12
    ccw4wcc  
       2023-04-26 11:04:39 +08:00
    webmagic
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5865 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:55 PVG 09:55 LAX 18:55 JFK 21:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86