Conseguir reptil 1 --- hablar de rastreador web
2 --- Conseguir reptil reptiles WebMagic marco
Getting Real reptil reptil 3 ---
3 combate reptil
3.1 Requisitos
Un período de tiempo desde el día **** arrastrándose blog de documentación, el artículo se almacena en la base de datos.
Listo para digital 3.2
Los siguientes son **** cada dirección de canal:
Aquí primera preparar dos tablas:
Lista de canales:
mesa de artículo:
Tb_channel añadir registros a la tabla:
3.3 de codificación
3.3.1 Módulo de escritura
( 1 ) crear el proyecto IDEA springboot (no se explica en detalle aquí), crear módulos article_crawler , la introducción de la dependencia
<dependencies>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
( 2 ) crear un perfil application.yml
server:
port: 9015
spring:
application:
name: article-crawler #指定服务名
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://****:3306/test_article?characterEncoding=UTF8
username: ****
password: ****
jpa:
database: MySQL
show-sql: true
redis:
host: ****
password: ****
(3) crear una clase de arranque
@SpringBootApplication
@EnableScheduling
public class ArticleCrawlerApplication {
public static void main(String[] args) {
SpringApplication.run(ArticleCrawlerApplication.class);
}
@Value("${spring.redis.host}")
private String redis_host;
@Value("${spring.redis.password}")
private String redis_password;
@Bean
public IdWorker idWorker(){
return new IdWorker(1,1);
}
@Bean
public RedisScheduler redisScheduler(){
JedisPoolConfig config = new JedisPoolConfig();// 连接池的配置对象
config.setMaxTotal(100);// 设置最大连接数
config.setMaxIdle(10);// 设置最大空闲连接数
JedisPool jedisPool=new JedisPool(config,redis_host,6379,20000,redis_password);
return new RedisScheduler(jedisPool);
}
(4) las clases de entidad y la interfaz de acceso a datos (no explicar aquí)
3.3.2 Clase de rastreo
Creación artículo arrastrándose clase ArticleProcessor
/**
* 文章爬取类
*/
@Component
public class ArticleProcessor implements PageProcessor {
@Override
public void process(Page page) {
page.addTargetRequests( page.getHtml().links().regex("https://blog.csdn.net/[a-z 0-9 -]+/article/details/[0-9]{8}").all());
//文章标题
String title=page.getHtml().xpath("//*[@id=\"mainBox\"]/main/div[1]/div/div/div[1]/h1").get();
String content=page.getHtml().xpath("//*[@id=\"article_content\"]/div[2]").get();
if(title!=null && content!=null){
page.putField("title" ,title );
page.putField("content",content);
}else{
page.setSkip(true);//跳过
}
}
@Override
public Site getSite() {
return Site.me().setRetryTimes(3000).setSleepTime(100);
}
}
3.3.3 clase de almacenamiento
Crear una clase de almacenamiento de artículos ArticleDbPipeline , es responsable para el rastreo de los datos almacenados en la base de datos
@Component
public class ArticleDbPipeline implements Pipeline {
@Autowired
private ArticleDao articleDao;
@Autowired
private IdWorker idWorker;
private String channelId;//频道ID
public void setChannelId(String channelId) {
this.channelId = channelId;
}
@Override
public void process(ResultItems resultItems, Task task) {
String title=resultItems.get("title");//取出标题
String content=resultItems.get("content");//内容
Article article=new Article();
article.setId(idWorker.nextId()+"");
article.setChannelid(channelId);
article.setTitle(title);
article.setContent(content);
articleDao.save(article);
}
}
3.3.4 clase Task
Crear una clase de tareas, de acuerdo @Scheduled establece el rastreo de temporización
/**
* 任务类
*/
@Component
public class ArticleTask {
@Autowired
private ArticleProcessor articleProcessor;
@Autowired
private ArticleDbPipeline articleDbPipeline;
@Autowired
private RedisScheduler redisScheduler;
/**
* 爬取AI文章
*/
@Scheduled(cron = "0 15 15 * * ?")
public void aiTask(){
System.out.println("开始爬取CSDN文章");
Spider spider =Spider.create(articleProcessor);
spider.addUrl("https://blog.csdn.net/nav/ai");
articleDbPipeline.setChannelId("ai");
spider.addPipeline(articleDbPipeline);
spider.setScheduler(redisScheduler);
spider.start();
}
}
springboot proyecto de ejecución, la consulta de los datos de base de datos, se puede ver la base de datos de almacenamiento de datos.
Por supuesto, lo anterior es sólo una simple entrada de la ingeniería de los reptiles, la producción de lo anterior se aplica a la necesidad real de establecer un Proxy IP, complejo de verificación más acerca de los códigos de operación, no a explicar aquí, está interesado en los zapatos de los niños, se puede estudiar a su propio.