Scrapy Crawler для рекурсивного разбора данных не может перезвонить - PullRequest
0 голосов
/ 18 января 2019

Я новичок, и я написал скрипт в Python Scrapy для получения информации рекурсивно.

Сначала он очищает ссылки города, включая информацию о турах, затем отслеживает все города и достигает их страниц. Далее, он получает необходимую информацию о турах, связанных с городом, прежде чем перейти к следующим страницам, и так далее. Разбивка на страницы выполняется на java-скрипте без видимой ссылки.

Команда, которую я использовал для получения результата вместе с выводом csv:

scrapy crawl pratice -o practice.csv -t csv

Ожидаемый результат - файл CSV:

title, city, price, tour_url
t1, c1, p1, url_1
t2, c2, p2, url_2
...

Проблема в том, что CSV-файл пуст. Запуск останавливается на "parse_page" и callback = "self.parse_item" не работает. Я не знаю, как это исправить. Возможно, мой рабочий процесс неверен или в моем коде есть проблемы. Спасибо за вашу помощь.

name = 'practice'
start_urls = ['https://www.klook.com/vi/search?query=VI%E1%BB%86T%20NAM%20&type=country',]

def parse(self, response): # Extract cities from country
    hxs = HtmlXPathSelector(response)
    urls = hxs.select("//div[@class='swiper-wrapper cityData']/a/@href").extract()
    for url in urls:
        url = urllib.parse.urljoin(response.url, url)
        self.log('Found city url: %s' % url)
        yield response.follow(url, callback=self.parse_page) # Link to city


def parse_page(self, response): # Move to next page
    url_ = response.request.url
    yield response.follow(url_, callback=self.parse_item)

    # I will use selenium to move next page because of next button is running
    # on javascript without fixed url.

def parse_item(self, response): # Extract tours
    for block in response.xpath("//div[@class='m_justify_list m_radius_box act_card act_card_lg a_sd_move j_activity_item js-item ']"):
        article = {}
        article['title'] = block.xpath('.//h3[@class="title"]/text()').extract()
        article['city'] = response.xpath(".//div[@class='g_v_c_mid t_mid']/h1/text()").extract()# fixed
        article['price'] = re.sub("  +","",block.xpath(".//span[@class='latest_price']/b/text()").extract_first()).strip()
        article['tour_url'] = 'www.klook.com'+block.xpath(".//a/@href").extract_first()

        yield article

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вместо использования Selenium выясните, какой запрос выполняет веб-сайт с использованием JavaScript (во время навигации перейдите на вкладку «Сеть» инструментов разработчика вашего браузера) и воспроизведите аналогичный запрос.

Веб-сайт использует JSON-запросы для извлечения элементов, которые намного проще анализировать, чем HTML.

Кроме того, если вы не знакомы с асинхронной природой Scrapy, вы можете столкнуться с неожиданными проблемами при использовании его в сочетании с Selenium.

Такие решения, как Splash или Selenium, предназначены для использования только в качестве последнего ресурса, когда все остальное терпит неудачу.

0 голосов
/ 18 января 2019
hxs = HtmlXPathSelector(response)    #response is already in Selector, use direct `response.xpath`

url = urllib.parse.urljoin(response.url, url)

использовать как:

url = response.urljoin (url)

да, он будет остановлен как повторяющийся запрос к пред.url, вам нужно добавить dont_filter=True check

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