我没有任何问题抓住三个统计数据:命中,运行和rbi。这是我到目前为止一直在使用的代码:
#import modules
from bs4 import BeautifulSoup
import requests, os
from selenium import webdriver
#start webdriver
os.chdir('C:\webdrivers')
header = {'User-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
options = webdriver.ChromeOptions(); options.add_argument("--start-
maximized")
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://www.baseball-reference.com/leagues/MLB/2018-standard-
batting.shtml')
#grab html
soup = BeautifulSoup(driver.page_source, 'html.parser')
driver.quit()
#parse three stats: rbi's, runs and hits
hits = [i.text for i in soup.find_all('td', {'data-stat': 'H'})]
runs = [i.text for i in soup.find_all('td', {'data-stat': 'R'})]
rbi = [i.text for i in soup.find_all('td', {'data-stat': 'RBI'})]
#print data
print(hits, runs, rbi)
上面的代码效果很好。然而,当我试图抓住击球手的名字时,我遇到了一些问题。击球手的名字未正确解析。如果可能的话,我想要他们的名字和姓氏。
这是我尝试过的:
print(soup.find_all('td', {'data-stat': 'player'}))
击球手的名字在代码中,但是有很多额外的数据。此外,当我尝试这行代码时,我的计算机速度减慢了很多。有什么建议?预先感谢您提供的任何帮助!
数据不在源页面中,请参考此链接:https://d3k2oh6evki4b7.cloudfront.net/short/inc/players_search_list.csv
这是您可以直接下载此文件的csv文件,或者您也可以使用代码获取所需的数据。
如何获得击球手的名字:
只是直接请求播放器数据,我在看到页面加载时找到了这个url,从这个url获取播放器名称将非常简单: https://d3k2oh6evki4b7.cloudfront.net/short/inc/players_search_list.csv
如何调试你的代码:
第一:使用selenium
加载webdriver将花费大部分时间在代码中。对于你的抓取目标,我建议你直接使用requests
而不是selenium
第二:lxml解析器将比html解析器更快,但你应该安装它,如果你从不使用它,只需运行“pip install lxml
”将帮助你。
installing-a-parser and summarizes the advantages and disadvantages of each parser library
例如:
import requests
from bs4 import BeautifulSoup
# start requests
target_url = 'https://www.baseball-reference.com/leagues/MLB/2018-standard-batting.shtml'
headers = {'User-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
page_source = requests.get(target_url, headers=headers).text
#grab html
soup = BeautifulSoup(page_source, 'lxml')
#parse three stats: rbi's, runs and hits
hits = [i.text for i in soup.find_all('td', {'data-stat': 'H'})]
runs = [i.text for i in soup.find_all('td', {'data-stat': 'R'})]
rbi = [i.text for i in soup.find_all('td', {'data-stat': 'RBI'})]
#print data
print(hits, runs, rbi)