如何使用Python从包含Javascript的动态网站中抓取数据?

时间:2019-12-05 10:13:44

标签: javascript excel python-3.x selenium-webdriver web-scraping

我正在尝试从https://www.doordash.com/food-delivery/chicago-il-restaurants/抓取数据

这个想法是刮掉有关网站上不同餐厅列表的所有数据。该网站分为不同的城市,但我只需要 芝加哥 的餐厅数据。

该城市的所有餐厅列表都必须与各个餐厅的其他任何相关数据(例如:评论,评分,美食,地址,州等)一起进行抓取。我需要在Excel中捕获城市的所有相应详细信息(当前4,326个列表)。

我试图在名为“ StoreCard_root___1p3uN”的类中提取餐厅名称,美食,评分和评论。但是没有显示任何数据。输出为空白。


from selenium import webdriver

chrome_path = r"D:\python project\chromedriver.exe"

driver = webdriver.Chrome(chrome_path)

driver.get("https://www.doordash.com/food-delivery/chicago-il-restaurants/")

driver.find_element_by_xpath("""//*[@id="SeoApp"]/div/div[1]/div/div[2]/div/div[2]/div/div[2]/div[1]/div[3]""").click()

posts = driver.find_elements_by_class_name("StoreCard_root___1p3uN")

for post in posts:
    print(post.text) ```


2 个答案:

答案 0 :(得分:1)

您可以使用API url作为实际通过XHR请求从其呈现的数据。

在下面的API链接和scrape上重复您想要的内容。

https://api.doordash.com/v2/seo_city_stores/?delivery_city_slug=chicago-il-restaurants&store_only=true&limit=50&offset=0

您只需将参数offset=0每次增加+50就可以遍历该参数,因为每个页面将显示50个项目,直到您到达4300作为最后一页!只需通过range(0, 4350, 50)

import requests
import pandas as pd

data = []
for item in range(0, 4350, 50):
    print(f"Extracting item# {item}")
    r = requests.get(
        f"https://api.doordash.com/v2/seo_city_stores/?delivery_city_slug=chicago-il-restaurants&store_only=true&limit=50&offset={item}").json()
    for item in r['store_data']:
        item = (item['name'], item['city'], item['category'],
                item['num_ratings'], item['average_rating'], item['average_cost'])
        data.append(item)

df = pd.DataFrame(
    data, columns=['Name', 'City', 'Category', 'Num Ratings', 'Average Ratings', 'Average Cost'])
df.to_csv('output.csv', index=False)
print("done")

输出样本:

enter image description here

在线查看输出:Click Here

完整数据在这里:Click Here

答案 1 :(得分:0)

您可以在导入必要的库后使用 for 循环:

    restaurant = []
    location = []
    ratings = []
    

    card_grids = driver.find_elements_by_class_name("StoreCard_root___1p3uN")
    for i in card_grids:
    restaurant.append(i.find_element_by_class_name("StoreCard_storeTitle___1tIOi").text)
    location.append(i.find_element_by_class_name("StoreCard_storeInfo___3EpLG").text) 
    s = i.find_elements_by_class_name("StoreCard_storeReviews___8EiRe")
    for e in s:
        ratings.append(e.text)