Фон
Я всегда интересовался краулерами, и моя дипломная работа в университете была проектом по краулеру (краулер для сбора информации из учебного отдела, а затем создание системы управления учебным отделом для Android, которая также получила награду за выдающийся дипломный проект). С тех пор, как я сталкиваюсь с веб-сайтами, которые меня интересуют, я пытаюсь их сканировать. Недавно на работе мне понадобилась информация о JD, поэтому я нашел открытый исходный код краулера WebMagic, который прост в использовании, легко настраивается и имеет мощные функции, хотя некоторые данные сайтов не подходят для использования. За последние несколько лет я написал более десятка краулеров, и постепенно у меня появилась идея абстрагировать код этих краулеров и создать простой краулерный фреймворк. Поэтому в конце 2017 года я начал разработку, но она прерывалась и возобновлялась. Только в августе этого года я выпустил версию, а затем успешно разместил её в публичном репозитории Maven. Один человек не может сделать всё, и для того, чтобы улучшить надёжность, удобство использования и расширяемость этого краулера, нужна помощь других!
Обновление от 20 августа 2019 года: в течение последних 12 месяцев данные о загрузках и использовании.
Особенности
Использование
На http://search.maven.org используйте последнюю версию. В pom.xml добавьте зависимость:
<dependency>
<groupId>com.github.vector4wang</groupId>
<artifactId>vw-crawler</artifactId>
<version>${last.version}</version>
</dependency>
Можно загрузить последнюю версию jar с главной страницы проекта release, а затем импортировать в свой собственный проект.
Шаги
Каждый этап поддерживает настройку.
Пример
Настройка основных параметров краулера, таких как User-Agent, начальный адрес, регулярное выражение целевого URL страницы, количество потоков и время ожидания и т. д.
new VWCrawler.Builder()
// 配置参数
.setHeader("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36") // 设置请求头
.setUrl("https://blog.csdn.net/qqhjqs") // 设置爬虫起始地址
.setThreadCount(10) // 设置几个线程抓取数据
.setTimeOut(5000) // 设置超时时间
// 抽象正则
.setTargetUrlRex("https://blog.csdn.net/qqhjqs/article/details/[0-9]+") // 设置目标页面url的正则表达式
// 解析页面
.setPageParser(new CrawlerService<Blog>() {
/**
* 有的url可能在某个场景下不需要可在此处理
* 默认返回false,可以不做处理
* @param url 即将要抓取的url
* @return
*/
@Override
public boolean isExist(String url) {
if ("https://blog.csdn.net/qqhjqs/article/details/79101846".equals(url)) {
return true;
}
return false;
}
/**
* 有的页面有WAF,可以再真正解析前,做个判断,遇到特殊标志的直接可以跳过
* 默认返回true,可以不做处理
* @param document 即将要解析的document
* @return
*/
@Override
public boolean isContinue(Document document) {
if ("最近和未来要做的事 - CSDN博客".equals(document.title())) {
System.out.println("模拟遇到WAF此页面不做解析");
return false;
}
return true;
}
/**
* 目标页面的doc对象,还有通过注解处理后的对象
* @param doc 文档内容
* @param pageObj 封装的对象
*/
@Override
public void parsePage(Document doc, Blog pageObj) {
// 可进行二次处理
pageObj.setReadNum(pageObj.getReadNum().replace("阅读数:", ""));
}
// 保存数据
/**
* 可以做保存对象的处理
* @param pageObj 页面对象
*/
@Override
public void save(Blog pageObj) {
System.out.println("save blog summery: " + pageObj.toString());
}
}) // 自定义解析service
.build().start(); // 启动
Настройка аннотаций объекта данных страницы
@CssSelector(selector = "#mainBox > main > div.blog-content-box > div.article-title-box > h1", resultType = SelectType.TEXT)
private String title;
@CssSelector(selector = "#mainBox > main > div.blog-content-box > div.article-info-box > div > span.time", dateFormat = "yyyy年MM月dd日 HH:mm:ss")
private Date lastUpdateDate;
@CssSelector(selector = "#mainBox > main >
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )