Предыдущий:Практика веб-краулера 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 и т. д.
- начать писать кодОсновной класс
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 выше
Однако результат таков:
Почему?Не ведитесь на текст подсказки, это явно первый раз, это не может быть вызвано частыми операциями. Возврат этого результата является методом защиты от сканирования, разработанным сервером веб-сайта. Сервер веб-сайта распознает, что никто не использует браузер для доступа к нему, поэтому возвращает этот результат. Поэтому программа должна максимально реалистично имитировать работу браузера, чтобы сервер сайта думал, что браузер посещает.
Как смоделировать максимально реалистично?Используйте программу, чтобы получить все данные в запросе в программу как можно больше
Согласно опыту, обычно сначала настраивают 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)