java爬虫抓取网页数据(一个用浏览器每次访问csdn首页看到的推荐文章还不一样)
优采云 发布时间: 2021-09-30 19:07java爬虫抓取网页数据(一个用浏览器每次访问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主页不一样,应该是后台有一些算法根据这个参数值去获取对应的数据,我这里就不赘述了,有兴趣的小伙伴可以一起讨论,欢迎在评论区留言~~~~~~