js抓取网页内容(新浪财经为例之1.依赖的jar包-1. )
优采云 发布时间: 2022-03-25 10:08js抓取网页内容(新浪财经为例之1.依赖的jar包-1.
)
使用 Selenium 和 PhantomJs 可以模拟用户操作并抓取大部分 网站。以新浪财经为例,我们抓取新浪财经的新闻版块。
1.依赖的jar包。我的项目是一个普通的SSM单间WEB项目。最后一个jar包用于抓取网页的DOM后解析网页的内容。
org.seleniumhq.selenium
selenium-java
3.2.0
javax
javaee-web-api
7.0
provided
com.google.guava
guava
20.0
cn.wanghaomiao
JsoupXpath
2.2
2.获取网页dom内容
package com.nsjr.grab.util;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import cn.wanghaomiao.xpath.model.JXDocument;
@SuppressWarnings("deprecation")
public class SeleniumUtil {
public static JXDocument getDocument(String driverUrl,String pageUrl){
JXDocument jxDocument = null;
PhantomJSDriver driver = null;
try{
System.setProperty("phantomjs.binary.path", driverUrl);
System.setProperty("webdriver.chrome.driver", driverUrl);
DesiredCapabilities dcaps = new DesiredCapabilities();
//ssl证书支持
dcaps.setCapability("acceptSslCerts", true);
//截屏支持
dcaps.setCapability("takesScreenshot", true);
//css搜索支持
dcaps.setCapability("cssSelectorsEnabled", true);
//js支持
dcaps.setJavascriptEnabled(true);
//驱动支持
dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,driverUrl);
//创建无界面浏览器对象
driver = new PhantomJSDriver(dcaps);
//WebDriver driver = new ChromeDriver(dcaps);
driver.get(pageUrl);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
Document document = Jsoup.parse(driver.getPageSource());
jxDocument = new JXDocument(document);
}catch(Exception e){
e.printStackTrace();
}finally{
if(driver != null){
driver.quit();
}
}
return jxDocument;
}
public static String getProperty(List list){
if(list.isEmpty()){
return "";
}else{
return list.get(0).toString();
}
}
}
3.解析并保存内容
JXDocument jxDocument = SeleniumUtil.getDocument(captureUrl.getDriverUrl(), captureUrl.getSinaNews());
//保存第一部分加粗新闻
List listh3 = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[@id='blk_hdline_01']/h3/a");
for(Object a :listh3){
JXDocument doc = new JXDocument(a.toString());
//System.out.println("地址:"+doc.sel("//a/@href"));
//System.out.println("标题:"+doc.sel("//text()"));
saveNews(SeleniumUtil.getProperty(doc.sel("//text()")), SeleniumUtil.getProperty(doc.sel("//a/@href")), Constant.NEWS_TYPE_BOTTOM, Constant.NEWS_SOURCE_SINA);
}
//保存其余新闻
List listP = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[@id='blk_hdline_01']/p/a");
for(Object a :listP){
JXDocument doc = new JXDocument(a.toString());
//System.out.println("地址:"+doc.sel("//a/@href"));
//System.out.println("标题:"+doc.sel("//text()"));
saveNews(SeleniumUtil.getProperty(doc.sel("//text()")), SeleniumUtil.getProperty(doc.sel("//a/@href")), Constant.NEWS_TYPE_BOTTOM, Constant.NEWS_SOURCE_SINA);
}
//保存第二部分新闻
List listpart2 = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[2]/ul");
for(Object a :listpart2){
JXDocument doc = new JXDocument(a.toString());
List alist = doc.sel("//li/a");
for(Object a2 :alist){
JXDocument doc2 = new JXDocument(a2.toString());
//System.out.println("地址:"+doc2.sel("//a/@href"));
//System.out.println("标题:"+doc2.sel("//text()"));
saveNews(
SeleniumUtil.getProperty(doc2.sel("//text()")),
SeleniumUtil.getProperty(doc2.sel("//a/@href")),
Constant.NEWS_TYPE_BOTTOM,
Constant.NEWS_SOURCE_SINA
);
}
}
4.解释
captureUrl.getDriverUrl(), captureUrl.getSinaNews() 这两个地址分别是PhantomJs工具的地址和要爬取的网站的地址,其中
sina_news = https://finance.sina.com.cn/
driverUrl= D:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe
PhantomJs工具的下载可以直接到官网下载。有windows和Linux版本可供下载。网页结构的解析使用了JsoupXpath,这是一个中国人写的html文档解析工具包,非常好用。语法可以参考Xpath的相关语法进行节点选择。
5. 爬取结果。由于项目要求比较简单,对实时性和性能要求不高,只有存储才能满足要求。
最后,刚开始接触爬虫的时候,有的需要webmagic可以满足,有的需要其他方法,具体问题需要详细分析。目前还在探索阶段,本文只提供解决方案。