動態頁面爬蟲前的準備:http://www.rzrgm.cn/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("http://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();// 執行爬蟲
}
}
浙公網安備 33010602011771號