首页 > 其他分享 >WebMagic动态页面爬取

WebMagic动态页面爬取

时间:2024-10-31 15:41:50浏览次数:1  
标签:codecraft new 爬取 us WebMagic import 页面 page webmagic

动态页面爬虫前的准备: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();// 执行爬虫
}
}

标签:codecraft,new,爬取,us,WebMagic,import,页面,page,webmagic
From: https://www.cnblogs.com/maohuidong/p/18517980

相关文章

  • 界面控件Kendo UI for Angular 2024 Q3亮点 - 全新的页面模板
    随着最新的2024Q3版本,Progress使用户能够使用现成的页面模板和构建块更快地构建令人惊叹的应用程序,使您的Telerik和KendoUI开发体验更好。Telerik和KendoUI 2024Q3版本将焦点放在新推出的页面模板和构建块上,每个页面模板和构建块都预先配置了TelerikUIforBlazor、KendoU......
  • edge浏览器如何打开不安全页面的禁止权限?
    第一步解决edge浏览器中站点不安全问题的方法1、首先,我们点击打开edge浏览器,然后将我们的浏览器右上角的【…】图标点击打开。2、这时,我们在打开的窗口中,将【设置】选项进行点击一下。3、随后进入到设置页面中,我们将左侧的【cookie和网站权限】选项进行左键点击一下。4、这......
  • 『玩转Streamlit』--页面布局
    一个优秀的数据应用不仅仅是功能的强大,更在于其用户体验的打造。而良好的页面布局,作为用户体验的重要组成部分,不仅能够提升信息的可读性,还能引导用户高效地完成操作。反之,混乱的布局会让人感到困惑和挫败,甚至导致用户放弃使用应用。在Streamlit中,Sidebar(侧边栏)、Columns(列布局)......
  • 访问网站404页面时出现301报错
    主机上设置了404错误页面,但在访问网页时,却出现了301报错。这是因为主机域名开启了强制HTTPS加密访问功能,导致服务器在处理HTTP请求时,先返回301状态码并自动跳转到HTTPS请求,然后再去请求404错误页面资源,从而导致301报错。可能原因强制HTTPS加密访问功能:当您对网站服务器发出一个......
  • html网页制作在线电影网页设计-html电影资讯博客网站模板(5个页面)
    html网页制作在线电影网页设计-html电影资讯博客网站模板(5个页面)一款黑色响应式的电影新闻资讯(首页/电影/明星/热点/新闻)等页面,电影热点资讯,电影博客类型网页模板html,html网站期末作品~电影资讯博客网站模板(HTML+CSS+JavaScript)涵盖个人、电影、美食、动漫、公司、......
  • 第七章利用CSS和多媒体美化页面
    通过对网页中元素、布局和色彩的合理设计,可以使网页达到较好的视觉效果。网页中常用超链接、列表和表格等网页元素,所以,对这些元素进行美化,可以大大提高网站的质量。尤其是多媒体元素的加入,使网页更加丰富多彩。7.1CSS链接的美化在前面的章节中,已经学习了超链接的简单知识......
  • ios input 键盘收起页面底部有间隙没有自动还原
    1.ios  input键盘收起页面底部有间隙没有自动还原解决办法:最外层元素增加fixed布局即可2.ios input输入页面会放大,收起时页面不自动还原解决办法input字体设置最小为16px即可3.网页标签切换获取切换状态document.addEventListener("visibilitychange",visibleChange......
  • 第七章 利用CSS和多媒体美化页面
    7.1CSS链接的美化1.文字链接的美化代码<!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <title>示例7.1</title> <style> #menu{ text-align:center; /*div内的元素水平居中*/ } a{ margin:10px; ......
  • grafana:页面修改为中文
    一,配置页面语言1,登录后,点击头像下菜单中->Profile2,在Preferences一栏下面,找到Language一项选择中文(简体)后点Save按钮即可二,查看效果:界面已调整为中文......
  • 业务-页面卡顿问题总结
    问题:1、web3.1地图绘制1000个标签实时位置,每隔8~10S左右就会卡顿2S,间歇性地持续进行2、在解决问题1之后,页面开始运行比较流畅,运行半小时后,页面逐渐卡死 定位思路:问题1:通过chrome浏览器的performance功能,截取卡顿前后,发现JS引擎执行时间在卡顿时间段内占比很高,放大细节来看,......