java爬虫抓取网页数据(一个用浏览器每次访问csdn首页看到的推荐文章还不一样)

优采云 发布时间: 2021-09-30 19:07

  java爬虫抓取网页数据(一个用浏览器每次访问csdn首页看到的推荐文章还不一样)

  一个简单的爬虫程序主要分为两部分:

  1、抓取网站资源,也就是我们通过浏览器看到的页面资源(HTML源码)。

  2、 制定过滤规则,过滤掉我们想要的数据。

  下面以爬取csdn首页文章信息为例,实现一个简单的Java爬虫。我这里是为了一个spring boot项目,jdk版本1.8。不得不说,新版eclipse自带maven,安装一个STS组件搭建srping启动项目简单快捷。话不多说,直接上代码。

  这是我的 pom 文件:

  

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.1.3.RELEASE

com.example

sqlTest

0.0.1-SNAPSHOT

sqlTest

Demo project for Spring Boot

1.8

org.springframework.boot

spring-boot-starter-data-jpa

org.springframework.boot

spring-boot-starter-jdbc

org.springframework.boot

spring-boot-starter-web

mysql

mysql-connector-java

5.1.25

org.springframework.boot

spring-boot-starter-test

test

org.jsoup

jsoup

1.11.3

org.springframework.boot

spring-boot-maven-plugin

  既然是spring boot项目,下面是properties文件(最基本的配置,不写注释):

  spring.datasource.url=jdbc:mysql://localhost:3306/myTest?useUnicode=true&characterEncoding=utf8

spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.datasource.username=root

spring.datasource.password=123456

spring.jpa.database=MYSQL

spring.jpa.show-sql=true

spring.jpa.hibernate.ddl-auto=none

#spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext

spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

server.port=8084

server.servlet.context-path=/test

  下面是双手的实现类:

  package com.example.demo;

import java.io.IOException;

import java.util.List;

import java.util.Random;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

import javax.persistence.EntityManager;

import javax.persistence.Query;

import javax.servlet.http.HttpServletRequest;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.transaction.annotation.Transactional;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import com.example.demo.bean.PUser;

import com.example.demo.dao.UserDao;

@Controller

public class TestController {

@Autowired(required = true)

private UserDao userDao;

@Autowired

private EntityManager em;

private Query query;

@Transactional

@RequestMapping("/hello1") //该方法的访问路径

public String test(Model model, HttpServletRequest request) {

String url1 = "https://www.csdn.net";//csdn首页的地址

crawler(url1);//开始爬虫

System.out.println("爬虫结束");

return "index.html";

}

//爬取csdn首页的文章信息

private void crawler(String urlString) {

try {

// 文章名称

String regex = ";}\">\\s[\\S\\s]+\\s\\s\\s[\\u4e00-\\u9fa5_a-zA-Z0-9\\s,!“”?()\\|-]+\\s=0) {

System.out.println(data);

}

//筛选出阅读数

start = data.indexOf("class=\"num\"");

if(start>=0) {

end = data.indexOf("", start);

readNum = data.substring(start+12, end);

}

System.out.println("阅读数:"+readNum);

//筛选出评论数

int start2 = data.indexOf("class=\"num\"", end);

if(start2>=0) {

int end2 = data.indexOf("", start2);

commonNum = data.substring(start2+12, end2);

}

System.out.println("评论数:"+commonNum+"\n");

//插入数据库

String sql = "insert into csdn_essay (essay_name,url,auther_name,time,read_num,common_num) values ('"+essayName+"','"+url+"','"+autherName+"','"+time+"','"+readNum+"','"+commonNum+"')";

em.createNativeQuery(sql).executeUpdate();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

  以上是爬虫工作的结果:

  

  首页默认只能爬到38条数据,用浏览器就可以看到。第一次加载也是38条数据,但是每次滑动到页面底部,会自动继续加载10条数据。所以我们判断每次加载时应该传递什么参数来控制加载的数据。好奇心促使我用burp Suite截取如下请求包,发现:

  

  前两个参数每次访问都是一样的,第三个参数show_offset看名字就很可疑了。前 10 位数字应为时间戳。我不知道后者是什么。我在url中拼接了这个参数,修改了参数值,发现得到的数据不太一样,但是和之前的对比是重复的。每次看到推荐的文章都想用浏览器访问csdn主页不一样,应该是后台有一些算法根据这个参数值去获取对应的数据,我这里就不赘述了,有兴趣的小伙伴可以一起讨论,欢迎在评论区留言~~~~~~

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线