动态页面爬虫前的准备:https://www.cnblogs.com/maohuidong/p/18517953

一:java maven添加依赖:

<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.4</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.4</version>
</dependency>
<!--selenium依赖-->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>

二:重写downLoader
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebDriver;
import us.codecraft.webmagic.downloader.Downloader;
import us.codecraft.webmagic.*;
import us.codecraft.webmagic.selector.PlainText;
import org.openqa.selenium.Cookie;
import java.util.Map;
public class MyDownloader implements Downloader {
//声明驱动
private RemoteWebDriver driver;

public MyDownloader() {
//第一个参数是使用哪种浏览器驱动,第二个参数是浏览器驱动的地址 --whitelisted-ips=""
// System.setProperty("webdriver.chrome.driver","C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe");
System.setProperty("webdriver.chrome.driver","E:\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe");

//创建浏览器参数对象
ChromeOptions chromeOptions = new ChromeOptions();
// 设置为 无界面浏览器 模式,若是不想看到浏览器打开,就可以配置此项

//解决 403 出错问题
chromeOptions.addArguments("--remote-allow-origins=*");
// chromeOptions.addArguments("--headless");
chromeOptions.addArguments("--window-size=1440,1080");// 设置浏览器窗口打开大小
this.driver = new ChromeDriver(chromeOptions); //创建驱动
}

/**
* 由于selenium的默认域名为data;因此第一次必须跳转到登录页,才能加入对应域名
* @param request Request
*/
@Override
public Page download(Request request, Task task) {
try {
driver.get(request.getUrl());//第一次打开url,跳转到登录页
Thread.sleep(3000);//等待打开浏览器
//获取从process返回的site携带的cookies,填充后第二次打开url
Site site = task.getSite();
if (site.getCookies() != null) {
for (Map.Entry<String, String> cookieEntry : site.getCookies()
.entrySet()) {
Cookie cookie = new Cookie(cookieEntry.getKey(),
cookieEntry.getValue());
driver.manage().addCookie(cookie);
}
//添加对应domain的cookie后,第二次打开url
driver.get(request.getUrl());
}
Thread.sleep(2000);
driver.executeScript("window.scrollTo(0, document.body.scrollHeight - 1000)");//需要滚动到页面的底部,获取完整的数据
Thread.sleep(2000);//等待滚动完成
//获取页面,打包成Page对象,传给PageProcessor 实现类
Page page = createPage(request.getUrl(), driver.getPageSource());
//driver.close();//看需要是否关闭浏览器
return page;
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}

@Override
public void setThread(int threadNum) {

}

//构建page返回对象
private Page createPage(String url, String content) {
Page page = new Page();
page.setRawText(content);
page.setUrl(new PlainText(url));
page.setRequest(new Request(url));
page.setDownloadSuccess(true);
return page;
}
}
三:重写pipeLine
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline;

public class MyPipeline implements Pipeline {
@Override
public void process(ResultItems resultItems, Task task) {
System.out.println("执行到这里了");
}

}


四:

import us.codecraft.webmagic.*;
import us.codecraft.webmagic.pipeline.JsonFilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import org.openqa.selenium.Cookie;
import java.util.Set;

public class MyPageProcessor implements PageProcessor {
private Set<Cookie> cookies = null;//用来存储cookie信息

/**
* 解析返回的数据page
* @param page Downloader实现类下载的结果。
*/
@Override
public void process(Page page) {
//向Pipeline对象中设置输出结果,把解析的结果放到ResultItems中
// page.putField("html", page.getHtml().all());
page.putField("html",page.getHtml().xpath("//li[@class='hotsearch-item']/a/span[@class='title-content-title']/text()").all());
}

//Site对象可以对爬虫进行一些配置,包括编码、抓取间隔、超时时间、重试次数等。
private final Site site = new Site()
.addHeader("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36")//添加header信息,当对方网站识别爬虫的时候,需要填写
.setDomain("example.com")//输入你要爬的网页域名,不带http和https前缀
.addCookie("token","auth")//通过F12看后台自己cookie的token值,填进去
.setTimeOut(2000);//设置超时时间

@Override
public Site getSite() {
if(cookies!=null && !cookies.isEmpty()){
//将获取到的cookie信息添加到webmagic中
for (Cookie cookie : cookies) {
site.addCookie(cookie.getName(),cookie.getValue());
}
}
return site;
}
//执行业务逻辑
public static void main(String[] args) {
Spider.create(new MyPageProcessor())
// 初始访问url地址
.addUrl("https://www.baidu.com")
.setDownloader(new MyDownloader())//可选择使用自定义的
// .addPipeline(new JsonFilePipeline("D:\\webmagic\\"))
// .addPipeline(new MyPipeline()) //自定义的Pipeline,不设置的话,信息自动打印到console界面上
.run();// 执行爬虫
}
}
posted on 2024-10-31 15:48  毛会懂  阅读(11)  评论(0编辑  收藏  举报