2015-05-08 2 views
1

Я новичок в модуле Python Scrapy. Я пытаюсь очистить информацию о ресторанах на https://munchado.com/search?sst=a&fb=m&vt=s&svt=l&in=New%20York%2C%20NY%2C%20USA&at=c&lat=40.7127&lng=-74.0059&p=0&srb=r&srt=d&sq=american&sdt=ft&ovt=restaurant&d=0&st=dScrape динамический контент в Python

Хотя у меня есть некоторый успешный опыт в соскабливании на других веб-страницах, это действительно проблема. Кажется, что информация о ресторанах загружается автоматически при доставке запроса на поиск. Под этим я подразумеваю, что информация не написана в исходном коде веб-страницы, и может произойти из внутреннего сервера компании или что-то в этом роде. И каталоги меняются по времени. Например, если вы ищете по вечерам, некоторые каталоги меняют свое имя с «div class = 't-has-deals» до «div class =' ​​t-closed-now».

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

+0

Я надеюсь, что [это] (http://stackoverflow.com/questions/13960567/reading-dynamically-generated-web-pages-using-python) может помочь вам –

ответ

1

При работе с динамическими сайтами сложно скрестить данные, чем обычным способом. Но сначала мы определяем, как данные визуализируются на страницах динамически. Данные могут отображаться следующим образом:

  1. Из файла javascript, который содержит данные.
  2. От ответа ajax.
  3. От ответа websocket. В этом случае мы должны сначала отправить соответствующее сообщение серверу, который дает нам ответ, который может содержать данные .
  4. От ответ api.

    Будет больше способов, чем я упоминал. В вашем случае данные процитированы из этого api_request_url. и ниже показано изображение form_data, которое мы должны предоставить во время запроса на номер api_request_url.

    formdata

которые дают вам json_response показать ниже

json_response

, который содержит данные, которые необходимы. Если вы измените параметр в form_data, вы получите данные соответствующим образом.

0

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

import time 
from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions 

driver = webdriver.Firefox() 
url = "www.google.com" 
driver.get(url) 

# If it takes a certain amount of time for the content to be created you can 
# use time.sleep 
time.sleep(5) 

# However if you want to wait for specified content to appear, you 
# can use the following 
try: 
    WebDriverWait(driver, 10).until(
     expected_conditions.presence_of_element_located(
          (By.ID, "id-of-your-element") 
            ) 
finally: 
    driver.quit() 

# then you can pull your html 
html = driver.page_source 

Selenium имеет отличное docs. Большая часть кода здесь действительно может быть найдена в документах.