在 Python 中抓取动态内容
Scrape dynamic content in Python
我是 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=d
上的餐厅信息
虽然我在其他网页上抓取过一些成功的经验,但这个真的很麻烦。
似乎当您发出搜索请求时,餐馆的信息会自动加载。我的意思是信息没有写在网页的源代码中,并且可能来自公司的内部服务器或其他东西。目录随时间变化。例如,如果您在晚上搜索,某些目录的名称会从 "div class='t-has-deals'" 更改为 "div class='t-closed-now'"。
所以我的问题是:是否仍然可以从此类网页中抓取信息。如果这件事属于抓取动态内容,有没有通用的方法来解决这个问题?非常感谢。
我对 scrapy 不太了解,所以我帮不了你,但你可以试试 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。这里的大部分代码其实都可以在文档中找到。
在处理动态网站时,抓取数据比正常方式更难。但首先我们确定了数据是如何在页面中动态呈现的。
数据可能以下列方式呈现:
- 来自包含数据的 javascript 文件。
- 来自 ajax 回复。
- 来自 websocket 响应。在这种情况下,我们必须先发送一个
给服务器的相关消息给我们一个可能的响应
包含数据。
来自 api 个回复。
会有比我提到的更多的方法。
在你的例子中,数据是从这个 api_request_url 中获得的。
下图显示了 form_data 我们需要在请求 api_request_url.[=13= 期间提供]
给你一个 json_response 显示如下
其中包含您需要的数据。
如果您更改 form_data 中的参数,您将获得相应的数据。
我是 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=d
上的餐厅信息虽然我在其他网页上抓取过一些成功的经验,但这个真的很麻烦。 似乎当您发出搜索请求时,餐馆的信息会自动加载。我的意思是信息没有写在网页的源代码中,并且可能来自公司的内部服务器或其他东西。目录随时间变化。例如,如果您在晚上搜索,某些目录的名称会从 "div class='t-has-deals'" 更改为 "div class='t-closed-now'"。
所以我的问题是:是否仍然可以从此类网页中抓取信息。如果这件事属于抓取动态内容,有没有通用的方法来解决这个问题?非常感谢。
我对 scrapy 不太了解,所以我帮不了你,但你可以试试 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。这里的大部分代码其实都可以在文档中找到。
在处理动态网站时,抓取数据比正常方式更难。但首先我们确定了数据是如何在页面中动态呈现的。 数据可能以下列方式呈现:
- 来自包含数据的 javascript 文件。
- 来自 ajax 回复。
- 来自 websocket 响应。在这种情况下,我们必须先发送一个 给服务器的相关消息给我们一个可能的响应 包含数据。
来自 api 个回复。
会有比我提到的更多的方法。 在你的例子中,数据是从这个 api_request_url 中获得的。 下图显示了 form_data 我们需要在请求 api_request_url.[=13= 期间提供]
给你一个 json_response 显示如下
其中包含您需要的数据。 如果您更改 form_data 中的参数,您将获得相应的数据。