Переход по страницам URL-адреса запроса веб-страницы с помощью Scrapy - PullRequest
0 голосов
/ 25 апреля 2020

Я хочу адаптировать этот урок (https://medium.com/better-programming/a-gentle-introduction-to-using-scrapy-to-crawl-airbnb-listings-58c6cf9f9808) для очистки этого сайта от крошечных списков домов: https://tinyhouselistings.com/.

В этом руководстве используется URL-адрес запроса, чтобы получить очень полный и чистый файл JSON, но это делается только для первой страницы. Кажется, что просмотр 121 страницы моего URL-адреса запроса крошечных домиков должен быть довольно простым, но я не смог заставить что-либо работать. Учебник не просматривает страницы URL-адреса запроса, а использует scrapy spla sh, запускаемый в контейнере Docker для получения всех списков. Я хочу попробовать это, но я просто чувствую, что через этот запрос можно сделать l oop.

Это выводит только первую страницу только URL запроса tinyhouselistings для моего проекта:

import scrapy

class TinyhouselistingsSpider(scrapy.Spider):
    name = 'tinyhouselistings'
    allowed_domains = ['tinyhouselistings.com']
    start_urls = ['http://www.tinyhouselistings.com']

    def start_requests(self):
        url = 'https://thl-prod.global.ssl.fastly.net/api/v1/listings/search?area_min=0&measurement_unit=feet&page=1'

        yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        _file = "tiny_listings.json"
        with open(_file, 'wb') as f:
                f.write(response.body)

Я пробовал это:

class TinyhouselistingsSpider(scrapy.Spider):
    name = 'tinyhouselistings'
    allowed_domains = ['tinyhouselistings.com']
    start_urls = ['']

def start_requests(self):
        url = 'https://thl-prod.global.ssl.fastly.net/api/v1/listings/search?area_min=0&measurement_unit=feet&page='
        for page in range(1, 121):
                self.start_urls.append(url + str(page))
                yield scrapy.Request(url=start_urls, callback=self.parse)

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

Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 26 апреля 2020

Удалить allowed_domains = ['tinyhouselistings.com'], поскольку URL thl-prod.global.ssl.fastly.net будет отфильтрован с помощью Scrapy

Поскольку вы используете метод start_requests, поэтому вам не нужен start_urls, вы можете иметь только один из них

import json

class TinyhouselistingsSpider(scrapy.Spider):
    name = 'tinyhouselistings'
    listings_url = 'https://thl-prod.global.ssl.fastly.net/api/v1/listings/search?area_min=0&measurement_unit=feet&page={}'

    def start_requests(self):
        page = 1
        yield scrapy.Request(url=self.listings_url.format(page),
            meta={"page": page},
            callback=self.parse)

    def parse(self, response):
        resp = json.loads(response.body)
        for ad in resp["listings"]:
            yield ad


        page = int(response.meta['page']) + 1
        if page < int(listings['meta']['pagination']['page_count'])
            yield scrapy.Request(url=self.listings_url.format(page),
                meta={"page": page},
                callback=self.parse)

С терминала запустите spider, используя , чтобы сохранить очищенные данные в JSON файле

scrapy crawl tinyhouselistings -o output_file.json
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...