Практика веб-краулера Java (5)

Java программист рептилия Ajax

Предыдущий:Практика веб-краулера Java (4)

Привет всем, все URL-адреса, представленные в предыдущих статьях, возвращают содержимое HTML, а затем анализируют данные, которые нам нужны, из строки HTML. Однако с развитием технологии программирования переднего плана такие технологии, как ajax и json, стали популярными как минимум десять лет назад. Многие данные, которые мы видим на веб-странице, асинхронно запрашиваются на сервере с помощью ajax, а затем результат ответа возвращается в формате данных json и загружается на веб-страницу.

Цель этой статьи: использоватьNetDiscoveryФреймворк сканера использует GET и POST для получения нужных данных json.

1) Получить название города

  • В раскрывающемся списке для выбора города есть основные названия городов в каждой провинции:

    选择城市

  • Откройте браузер и найдите ссылку, предоставляющую этот источник данных:

猜测估计是这个
预览一下返回的数据

  • на основеNetDiscoveryТеперь начните писать код (код предназначен только для демонстрации того, как получить данные)

Основной класс

package com.cv4j.netdiscovery.example;

import com.cv4j.netdiscovery.core.Spider;
import com.cv4j.netdiscovery.core.domain.HttpMethod;
import com.cv4j.netdiscovery.core.domain.Request;

public class TestSpider {
    public static void main(String[] args) {
        String url = "https://www.zhipin.com/common/data/city.json";
        Request request = new Request(url)
                .httpMethod(HttpMethod.GET);  //GET不设置也可以的,默认就是

        Spider.create()
                .name("getcitys")
                .request(request)
                .parser(new TestParser())
                .run();
    }
}

Класс парсера

package com.cv4j.netdiscovery.example;

import com.cv4j.netdiscovery.core.config.Constant;
import com.cv4j.netdiscovery.core.domain.Page;
import com.cv4j.netdiscovery.core.parser.Parser;

public class TestParser implements Parser {
    @Override
    public void process(Page page) {
        try {
            String response = page.getField(Constant.RESPONSE_JSON).toString();
            System.out.println("response = "+response);
        } catch(Exception e) {
        }
    }
}

  • результат выполнения программы
    通过程序获取到数据了

2) Получайте объявления о вакансиях

  • Точно так же сначала используйте человеческую плоть браузера для анализа целевого объекта:

    目标

  • Посмотрите еще раз на параметры, которые нужно передать

Чтобы отличить параметры передачи GET и POST,

Иметь представление о типе параметров POST: application/json, application/x-www-form-urlencode и т. д.

POST请求

  • начать писать кодОсновной класс
package com.cv4j.netdiscovery.example;

import com.cv4j.netdiscovery.core.Spider;
import com.cv4j.netdiscovery.core.config.Constant;
import com.cv4j.netdiscovery.core.domain.HttpMethod;
import com.cv4j.netdiscovery.core.domain.HttpRequestBody;
import com.cv4j.netdiscovery.core.domain.Request;

import java.util.HashMap;
import java.util.Map;

public class TestSpider {
    public static void main(String[] args) {
        String url = "https://www.lagou.com/jobs/positionAjax.json?city=%E8%8B%8F%E5%B7%9E&needAddtionalResult=false&isSchoolJob=0";

        Map<String,Object> postParams = new HashMap<>();
        postParams.put("first",true);
        postParams.put("pn",1);
        postParams.put("kd","数据工程师");

        Request request = new Request(url)
                .httpMethod(HttpMethod.POST)
                .httpRequestBody(HttpRequestBody.form(postParams, Constant.UTF_8));

        Spider.create()
                .name("getpositions")
                .request(request)
                .parser(new TestParser())
                .run();
    }
}

Parser похож на TestParser выше

Однако результат таков:

没得到我们想要的结果

Почему?Не ведитесь на текст подсказки, это явно первый раз, это не может быть вызвано частыми операциями. Возврат этого результата является методом защиты от сканирования, разработанным сервером веб-сайта. Сервер веб-сайта распознает, что никто не использует браузер для доступа к нему, поэтому возвращает этот результат. Поэтому программа должна максимально реалистично имитировать работу браузера, чтобы сервер сайта думал, что браузер посещает.

Как смоделировать максимально реалистично?Используйте программу, чтобы получить все данные в запросе в программу как можно больше

http请求的headers

Согласно опыту, обычно сначала настраивают Referer и User-Agent (см. http-протокол)

новый основной класс

package com.cv4j.netdiscovery.example;

import com.cv4j.netdiscovery.core.Spider;
import com.cv4j.netdiscovery.core.config.Constant;
import com.cv4j.netdiscovery.core.domain.HttpMethod;
import com.cv4j.netdiscovery.core.domain.HttpRequestBody;
import com.cv4j.netdiscovery.core.domain.Request;

import java.util.HashMap;
import java.util.Map;

public class TestSpider {
    public static void main(String[] args) {
        String url = "https://www.lagou.com/jobs/positionAjax.json?city=%E8%8B%8F%E5%B7%9E&needAddtionalResult=false&isSchoolJob=0";

        Map<String,Object> postParams = new HashMap<>();
        postParams.put("first",true);
        postParams.put("pn",1);
        postParams.put("kd","数据工程师");

        Request request = new Request(url)
                .httpMethod(HttpMethod.POST)
                .referer("https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8B%E5%B8%88?labelWords=sug&fromSearch=true&suginput=%E6%95%B0%E6%8D%AE%E5%B7%A5%E7%A8%8B")
                .ua("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36")
                .httpRequestBody(HttpRequestBody.form(postParams, Constant.UTF_8));

        Spider.create()
                .name("getpositions")
                .request(request)
                .parser(new TestParser())
                .run();
    }
}

Сервер, наконец, возвращает результат с данными (полезны данные или нет, требует дальнейшего анализа):

有数据的结果

3) Резюме

Знания этой статьи включают в себя: освоение концепции асинхронного выполнения ajax, понимание формата данных json и обучение использованию инструментов отладки, таких как инструменты разработчика Google Chrome и т. д.

Самое главное — понять протокол http.

Друзья, кто хочет сделать это самостоятельно, пожалуйста, посетите гитхабNetDiscovery, ваши лайки — это движущая сила постоянного улучшения фреймворка!

Эта статья предназначена только для обмена методами программирования, и не рекомендуется часто обращаться к чужим производственным серверам.

Следующий:Практическая операция Java Crawler (6)