从特定站点快速抓取 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。
您可以使用不同的方法将它们转换为不同的类型。
我正在尝试从网页上抓取 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。 您可以使用不同的方法将它们转换为不同的类型。