Java爬虫框架 webmagic xpath的使用心得
获取标签内的属性值
示例获取a内的 href值
//a/@href
仅获取标签的文本,不要标签本身
在后续的高版本中,选择器仅提供了get()方法,当使用xpath时,会将连同标签本身一起输出,
例如
//span[@class='title']
这种会将<span>本身也输出,需要这样写:
//span[@class='title']/text()
然后是关于爬取动态渲染的数据
第一个方法就是 抓 ajax接口,直接拿到json数据
但是如果没有接口,数据是直接渲染的,就拿不到了,
那就要selenium-Java这种工具配合chrome或edge浏览器,需要下载driver包,具体可以在收藏里查看别人整理好的。
大概思路是,利用浏览器去打开渲染好的页面,再从页面里根据去爬取标签获得想要的内容。
selenium-Java 遇到的问题
1.第一个就是一直报403的问题,这个问题因为默认只能访问localhost的接口,解决办法是:
System.setProperty("webdriver.chrome.whitelistedIps", "");
2.第二个问题是会弹出chrome窗口的问题,这个可以使用无头模式,加入设置:
ArrayList<String> cliArgsCap = new ArrayList<String>();
cliArgsCap.add("--web-security=false");
cliArgsCap.add("--ssl-protocol=any");
cliArgsCap.add("--ignore-ssl-errors=true");
cliArgsCap.add("--remote-allow-origins=*");
cliArgsCap.add("--headless");//无头模式
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments(cliArgsCap);
如果部署到linux上时,需要注意linux不同发行版支持的版本,可以从这个网站下载对应的chrome以及驱动,保持一致性,注意权限
https://sites.google.com/chromium.org/driver/downloads
由于linux的特殊性,options.addArguments(“–no-sandbox”); // 禁用沙箱(Linux必要)
3.第三个是 config.ini 的问题,如果导入的是webmagic集成的selenium,由于包里是写死的路径,所以不方便修改,参考了别人的做法,将源码下载并去掉了默认配置,鉴于Selenium 已经不再支持 PhantomJS,下载webmagic-selenium源码,然后修改剔除掉原有代码中对PhantomJS的使用,加入到自己的项目中使用即可。
4.集成到springboot中出现的依赖问题
通过 new 创建的 OrderInfoPipeline 实例不会被 Spring 容器管理,因此其中的 @Resource 注解不会生效
由于依赖注入没有生效,service 字段保持为 null,导致了 NullPointerException
解决方案是:
在 OrderCrawlerService 类中通过 @Resource 注入 Spring 管理的 OrderInfoPipeline 实例
在 ErpPurchaseInServiceImpl 类中添加了 @Override 注解,确保方法签名正确
确保接口和实现类中的方法名称一致
这样,Spring 容器会正确管理所有的依赖关系,确保 OrderInfoPipeline 中的 service 字段被正确注入,从而避免 NullPointerException。