js抓取网页内容(新浪财经为例之1.依赖的jar包-1. )

优采云 发布时间: 2022-03-25 10:08

  js抓取网页内容(新浪财经为例之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可以满足,有的需要其他方法,具体问题需要详细分析。目前还在探索阶段,本文只提供解决方案。

   

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线