我是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'”。
所以我的问题是:是否仍然可以从这些网页中删除信息。如果此事属于抓取动态内容,是否有通用的方法来解决这个问题?非常感谢你。
答案 0 :(得分:2)
在处理动态网站时,很难以正常方式抓取数据。但首先我们确定如何动态地在页面中呈现数据。 数据可能以下列方式呈现:
来自api回复。
将会有比我提到的更多的方式。 在您的情况下,数据来自此api_request_url。 以下图片显示了在 api_request_url 的请求中我们需要提供的 form_data 。
这会给你一个 json_response 显示在下面
包含您需要的数据。 如果您更改 form_data 中的参数,则会相应地获取数据。
答案 1 :(得分:0)
我不确定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。这里的大部分代码实际上都可以在文档中找到。