从特定站点快速抓取 table

Scrape table from specific site fastly

我正在尝试从网页上抓取 table,该页面共有两个 table,我可以使用 selenium 和 pandas 抓取它。 Selenium 用于将页面源提供给 pandas,但这是一种缓慢的方法,因为我必须在 2 天内抓取将近 15000 个相同的 table。我使用的代码如下

import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome import service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = "https://greyhoundbet.racingpost.com/#results-dog/race_id=1807732&dog_id=539402&r_date=2021-01-01&track_id=4&r_time=13:24"
def extract(url):
    wd = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=option)
    wd.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'})
    wd.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
    wd.get(url)
    time.sleep(8)

    all_tables = pd.read_html(wd.page_source, attrs={'id': 'sortableTable'})
    all_tables = pd.concat(all_tables)
    all_tables.to_csv('test.csv', encoding='utf-8', index=False)

我试过用 scrapy 读取页面,但 response.css('table') 显示空列表

我也试过 pandas 只是请求也显示没有找到 table。 pandas 方法

import requests
import pandas as pd
from bs4 import BeautifulSoup
url = "https://greyhoundbet.racingpost.com/#results-dog/race_id=1807732&dog_id=539402&r_date=2021-01-01&track_id=4&r_time=13:24"
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')#tried with and without this line

dfs = pd.read_html(page.text)
print(dfs)

如果有人分享替代快速方法,那将是很大的帮助 或对提供的进行修改以使其更快

我建议使用Request包来爬取本站数据。这样可以加快速度。你可以在这个link.

中看到table的数据

这个link给你JSON,你可以轻松地将它变成数据列表或字典。

看到这个:

import json
import requests

data = requests.get('http://greyhoundbet.racingpost.com/results/blocks.sd?race_id=1807732&dog_id=539402&r_date=2021-01-01&track_id=4&r_time=13%3A24&blocks=results-dog-header%2Cresults-dog-details')

dog_header = json.loads(data.content)['results-dog-header']
dog_details = json.loads(data.content)['results-dog-details']

print(dog_header)
print(dog_details)

输出:

{'dogs': [{'raceId': '1807732', 'position': '1', 'trap': '1', 'resultHandicap': '', 'name': 'Uknowyerwan', 'dogSex': '',....

{'forms': [{'rInstId': '1877705', 'raceTime': '2021-12-17 16:08', 'rFormDatetime': '2021-12-17 16:08', 'distMetre': '480', '....

这些结果以字典的形式存在 class。 您可以使用不同的方法将它们转换为不同的类型。