用java的jsoup爬取数据,但是只能爬取成功前一百条

!只用于自己学习,不会用于任何商业用途!
用java的jsoup采集信息,想采集2400条数据,运行结果只能采集到第169条,自己猜测是因为被反爬取了,如何修改?以下是前部分的代码(网页元素未放上来)和采集截图。

代码:


public static void main(String[] args) throws IOException {
    System.out.println("开始采集:\r\n文献名称;URL地址;作者;来源;摘要;关键词;年代;DOI;被引");
    int    totalPageStr =240;                
    int num=0;//计算文章总数
    String keystr = "健康信息"; //检索关键词 
    String url="https://xueshu.baidu.com/";        
    for (int i =0; i <totalPageStr ; i++) {
    url="https://xueshu.baidu.com/s?wd="+URLEncoder.encode(keystr, "UTF-8")+"&pn="+i+"0&tn=SE_baiduxueshu_c1gjeupa&ie=utf-8&filter=%28sc_c1%3A%3D%7B22%7D%29&sc_f_para=sc_tasktype%3D%7BfirstSimpleSearch%7D&bcp=2&sc_hit=1";
    //URLEncoder.encode(keystr, "UTF-8")将关键词转换为UTF-8编码
    System.out.println(url);    
    Document doc= Jsoup.connect(url).data("query", "Java")
            .timeout(10000)
            .get();            
    Elements divs=doc.select("div#bdxs_result_lists>div.result");
    doc.setBaseUri("https://xueshu.baidu.com/");    

截图:

img

不一定是反爬,也可能是后面的内容是动态加载的~就像刷微博。一般网站不会一下子加载上千条数据的,带宽怎么顶得住啊。

可以批量请求,传下分页参数,动态加载一下后面的内容。

你不是把url打印出来了么,有么有被反爬,只需要把那个url复制到浏览器中看下是否能打开,或者单独爬取这一个url,看下能否获取到数据,这样就能判断是否是被反爬,先确定原因再说。请采纳

Java使用jsoup爬取网页数据
借鉴下
https://blog.csdn.net/wohaipagui/article/details/124726644

可能数据只显示那么多,你手动用网页能打开浏览超过你下载的数据条目总数吗?不能的话是爬不出来的。

除非有bug,就是在网站开发者构建API的时候没有设置限制,可以自行修改访问API的参数全部都划拉下来。

每次循环爬取的时候,添加一个时间间隔,例如:每次间隔2秒爬取一次,Thread.sleep(2000)。

我认为你那是静态爬取,网页肯定不会一次性返回所有数据给你,你可以自己写个批量动态请求,动态修改请求入参,以保证能爬取完整的数据。

看起来你的代码是在百度学术上爬取信息。在这种情况下,你的代码很可能被百度学术反爬取系统检测到,因此被阻止了爬取。

为了防止被反爬取,你可以采取以下措施:

1、使用更多的代理服务器,并在每次请求时随机使用一个代理服务器。这样可以减少被网站反爬取系统检测到的可能性。

2、在请求时加入模拟浏览器的信息,例如 User-Agent 头。这样可以让网站以为你是一个普通的浏览器在访问,而不是爬虫。

3、在爬取数据时加入延时,让爬取的速度更慢。这样可以减少被反爬取系统检测到的可能性。

4、使用百度学术的 API 获取信息。百度学术提供了 API 服务,你可以使用这个 API 获取信息,避免被反爬取系统检测到。

为了在请求时加入模拟浏览器的信息,你可以在调用 Jsoup.connect() 方法时添加 User-Agent 头。例如:

Document doc = Jsoup.connect(url)
    .data("query", "Java")
    .timeout(10000)
    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36")
    .get();

为了在爬取数据时加入延时,你可以使用 Java 的 Thread.sleep() 方法来停顿一段时间。例如,你可以在爬取一条数据后停顿 5 秒:

Thread.sleep(5000);

建议你在爬取数据时加入一个随机延时,这样可以更加真实地模拟浏览器的访问。你可以使用 Java 的 Random 类来生成一个随机数,然后使用 Thread.sleep() 方法停顿相应的时间。例如:


Random random = new Random();
int delay = random.nextInt(5) + 1; // 随机生成 1-5 的数字
Thread.sleep(delay * 1000); // 停顿 delay 秒

望采纳!!!