«No20: Руководство по началу работы с Golang Crawler»

задняя часть рептилия регулярное выражение CSS

1.jpg

2.jpg

Всем привет, меня зовут Се Вэй, я программист.

Я много писал о краулерах, и это последний раз, когда я упоминаю краулеры в статье. Я больше не буду писать в будущем, я хочу изучать другие области.

Тема этого раздела: Как начать работу с поисковым роботом Golang.

В основном делится на следующие этапы:

  • Получить исходный код веб-страницы
  • Аналитические данные
  • Хранение данных

1. Получите исходный код веб-страницы

Просто сделайте запрос, используя родную библиотеку net/http:

GET

func GetHttpResponse(url string, ok bool) ([]byte, error) {
	request, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return nil, errors.ErrorRequest
	}

	request.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36")

	client := http.DefaultClient

	response, err := client.Do(request)

	if err != nil {
		return nil, errors.ErrorResponse
	}

	defer response.Body.Close()
	fmt.Println(response.StatusCode)
	if response.StatusCode >= 300 && response.StatusCode <= 500 {
		return nil, errors.ErrorStatusCode
	}
	if ok {

		utf8Content := transform.NewReader(response.Body, simplifiedchinese.GBK.NewDecoder())
		return ioutil.ReadAll(utf8Content)
	} else {
		return ioutil.ReadAll(response.Body)
	}

}

POST

func PostHttpResponse(url string, body string, ok bool) ([]byte, error) {
	payload := strings.NewReader(body)
	requests, err := http.NewRequest("POST", url, payload)
	if err != nil {
		return nil, errors.ErrorRequest
	}
	requests.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	requests.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36")
	client := http.DefaultClient
	response, err := client.Do(requests)
	if err != nil {
		return nil, errors.ErrorResponse
	}

	fmt.Println(response.StatusCode)

	defer response.Body.Close()
	if ok {
		utf8Content := transform.NewReader(response.Body, simplifiedchinese.GBK.NewDecoder())
		return ioutil.ReadAll(utf8Content)
	}
	return ioutil.ReadAll(response.Body)

}

Используя две вышеупомянутые функции, исходный код веб-страницы можно получить независимо от того, является ли запрос Get или Post.Единственное, что необходимо отметить, это то, что запрос Post должен передавать правильные параметры в запрос.


Использование нативной библиотеки требует написания большого количества кода. Есть ли более лаконичный способ его написания?

Кто-то дополнительно инкапсулировал нативную библиотеку net/http, чтобы сформировать такую ​​библиотеку: gorequest.

документация gorequest

Открытый интерфейс очень прост:

resp, body, errs := gorequest.New().Get("http://example.com/").End()

Одна строка кода может выполнить один запрос.

Почтовые запросы также могут быть выполнены относительно легко:

request := gorequest.New()
resp, body, errs := request.Post("http://example.com").
  Set("Notes","gorequst is coming!").
  Send(`{"name":"backy", "species":"dog"}`).
  End()

Вышеуказанными двумя способами, в соответствии с вашими предпочтениями, вы можете получить исходный код веб-страницы. Это первый шаг.


2. Проанализируйте данные

Нам нужно дополнительно проанализировать полученный исходный код веб-страницы, чтобы получить нужные нам данные.

В зависимости от типа ответа мы можем выбрать разные методы.

Как правило, если ответ представляет собой данные в формате html, то мы можем дружно выбрать регулярное выражение или селектор Css, чтобы получить нужный нам контент.

Но если это данные json, то мы можем использовать нативную библиотеку encoding/json для правильной десериализации данных, а также получить данные.

Ну а зная конкретный метод, то наша цель:

  • Знакомы с использованием регулярных выражений, знаете, как писать регулярные выражения в соответствующих обстоятельствах
  • Знаком с сериализацией и десериализацией json.
  • Знакомы со значением символов селектора css, можете написать селектор css в окне отладки chrome.

1. Основная идея

  • Ясно, что нужно
  • Анализировать веб-страницы
  • Получить информацию о веб-странице
  • Разобрать информацию о веб-странице

2. Анализ веб-страниц

  • Браузер Chrome проверяет элемент, просматривает исходный код веб-страницы

3. Типы значений ответа веб-страницы

  • json: Как правило, вызывается именно API, который легче анализировать, просто парсить данные json.
  • xml: не часто
  • html: общий, используйте регулярные выражения, селекторы CSS, XPATH, чтобы получить то, что вам нужно

4. Тип запроса

  • Get : common, просто запросите его напрямую
  • Сообщение: необходимо проанализировать параметры запроса, построить запрос, отправить запрос на противоположный сервер, а затем проанализировать значение ответа.

5. Запросить информацию заголовка

  • Информация заголовка Uer-Agent

6. Хранение

  • Локальный: текст, JSON, CSV
  • База данных: реляционная (postgres, MySQL), нереляционная (mongodb), поисковая система (elasticsearch)

7. Обработка изображений

  • просить
  • место хранения

8. Другие

  • прокси: IP пул
  • User-Agent: имитация браузера
  • APP: данные APP должны использовать инструменты захвата пакетов: Mac (Charles), Windows (Fiddler) (анализ Api)

9. Трудности

  • распределенный
  • Массовый скрапинг

Пример

Несколько основных моментов

Как получить исходный код веб-страницы

  • родная сеть/http
  • gorequest (на основе встроенной оболочки net/http)

Метод запроса веб-клиента

  • Получите подавляющее большинство
  • Post

Ответ веб-сервера

  • json
  • html

Как обрабатывать ответы веб-сервера

  • json: используйте собственную сериализацию json или используйте gjson (сторонний)
  • html: регулярные выражения, селекторы CSS, Xpath

Как хранить данные

  • Text
  • Json
  • Csv
  • db

Первые три связаны с чтением и записью файлов, последняя — с операциями с базой данных.

исходный код

только для справки:Ссылаться на


Текст окончен, я Се Вэй, до свидания.