Scrapy - Спросите слишком много просьб? - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь получить широту и долготу городов из этого URL: https://www.latlong.net/. Мой код:

# -*- coding: utf-8 -*-
import re
import json

import scrapy

class geo_spider(scrapy.Spider):
    name = "geo"
    allowed_domains = ["www.latlong.net"]
    start_urls = ['https://www.latlong.net/']

    custom_settings = {
        'COOKIES_ENABLED': True,
        'DOWNLOAD_DELAY' : 1,
    }

    LAT_LONG_REGEX = 'sm\((?P<lat>.+),(?P<long>.+),'

    def start_requests(self):
        FILE_PATH = 'C:/Users/coppe/tutorial/cities.json'
        with open(FILE_PATH) as json_file:
            cities_data = json.load(json_file)
        for d in cities_data:
            yield scrapy.Request(
                url='https://www.latlong.net/',
                callback=self.gen_csrftoken,
                meta={'city': d['city']},
                dont_filter=True, 
            )

        def gen_csrftoken(self, response):
            city = response.meta['city']
            yield scrapy.FormRequest.from_response(
                response,
                formid='frmPlace',
                formdata={'place': city},
                callback=self.get_geo,
                meta={'city': city}
            )

        def get_geo(self, response):
            lat_long_search = re.search(self.LAT_LONG_REGEX, response.body.decode('utf-8'))
            if lat_long_search:
                yield {
                    'coord': (lat_long_search.group('lat'), lat_long_search.group('long')),
                    'city': response.meta['city']
                }
                else:
                    from scrapy.shell import inspect_response
                    inspect_response(response, self)

Я должен получить что-то вроде (50,5) в качестве координаты для589 городов, содержащихся в файле JSON.Все работает, кроме того, что я получаю (0,0) для каждого города.Я думал, что это проблема с JavaScript, но это не так.Действительно, когда я уменьшаю свой файл JSON, например, до 6 городов, я получаю правильную координату для каждого города.Я пытаюсь использовать настройку DOWNLOAD_DELAY с разными значениями (1,2 и 3), но все равно она не работает.Является ли мой файл JSON слишком тяжелым?У кого-нибудь есть подсказка по этому вопросу?

1 Ответ

1 голос
/ 05 апреля 2019

Похоже, что веб-сайт использует API, такой как API геокодирования Карт Google, задокументированный на https://developers.google.com/maps/documentation/geocoding/intro
Этот документ (не говорит о выполнении нескольких запросов одновременно, поэтому не фактический используемый API?) Говорит, чтоМаксимальный размер ссылки API составляет 8192 символа, включая саму ссылку и все места, которые вы ищете.
Так что да, помимо ограничения скорости, в названии вашего города должно быть максимальное количество символов.!

Запрос API геокодирования имеет следующий вид: https://maps.googleapis.com/maps/api/geocode/outputFormat?parameters ...
Примечание: URL-адреса должны быть правильно закодированы, чтобы быть действительными, и ограничены 8192 символами для всех веб-сайтов.Сервисы.Помните об этом ограничении при создании ваших URL.Обратите внимание, что разные браузеры, прокси-серверы и серверы могут также иметь различные ограничения символов URL.

...