在python中,如何从目标url中的url抓取数据并将所有内容修改为单个数据帧?

2024-09-28 21:25:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个网页(A)中刮取数据点,但随后从每个数据点自己的网页中刮取数据,并将所有数据合并到单个数据框中以便于查看

这是一个包含四列的每日数据框架:Team、Pitcher、ERA、WHIP。在特定投手的url中可以找到ERA和WHIP。对于下面的数据,我已经设法把球队的名字和首发投手的名字划入一个数据框(尽管不正确)

import requests
from bs4 import BeautifulSoup
import pandas as pd
import re
targetUrl = 'http://www.baseball-reference.com/previews/'
targetUrl_response = requests.get(targetUrl, timeout=5)
soup = BeautifulSoup(targetUrl_response.content, "html.parser")    

teams = []
pitchers = []

for i in soup.find_all('tr'):
    if i.find_all('strong'):
        for link in i.find_all('strong'):
            if not re.findall(r'MLB Debut',link.text):
                teams.append(link.text)
            if i.find_all('a'):
                for link in i.find_all('a'):
                    if not re.findall(r'Preview',link.text):
                        pitchers.append(link.text)
print (df)

我想添加代码跟踪每个投手的网页,刮时代和鞭子,然后修改数据到同一个数据框作为球队和投手的名字。这有可能吗

目前产量:

                     0
Aaron Sanchez      TOR
CC Sabathia        NYY
Steven Matz        NYM
Zach Eflin         PHI
Lucas Giolito      CHW
Eduardo Rodriguez  BOS
Brad Keller        KCR
Adam Plutko        CLE
Julio Teheran      ATL
Jon Lester         CHC
Clayton Kershaw    LAD
Zack Greinke       ARI
Jon Gray           COL
Drew Pomeranz      SFG

Tags: 数据textinimportre网页forif
1条回答
网友
1楼 · 发布于 2024-09-28 21:25:26

几乎没有什么不经意的事情(请看我在那里做了什么:-)sports-reference.com页面是动态的。您可以直接拉一些表,但是如果有多个表,您可以在html源代码的注释标记下找到它们。因此,如果您希望从页面中获得更多数据,这可能是以后的问题

第二件事是我注意到你正在拉<tr>标签,这意味着有<table>标签,熊猫可以为你做繁重的工作,而不是用bs4迭代。这是一个简单的pd.read_html()函数。然而,它不会拉出那些链接,只是严格的文本。因此,在本例中,使用BeautifulSoup进行迭代是一种可行的方法(我只是提到它以供将来参考)

还有更多的工作要做,因为有几个家伙没有链接/返回时代或鞭子。如果一个球员被交易或者改变了联赛,你也必须考虑到,2019年的同一个赛季可能会有多个时代。但这应该会让你走:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import re
targetUrl = 'http://www.baseball-reference.com/previews/'
targetUrl_response = requests.get(targetUrl, timeout=5)
soup = BeautifulSoup(targetUrl_response.content, "html.parser")    

teams = []
pitchers = []
era_list = []
whip_list = []

for i in soup.find_all('tr'):
    if i.find_all('strong'):
        for link in i.find_all('strong'):
            if not re.findall(r'MLB Debut',link.text):
                teams.append(link.text)
            if i.find_all('a'):
                for link in i.find_all('a'):
                    if not re.findall(r'Preview',link.text):
                        try:
                            url_link = link['href']
                            pitcher_table = pd.read_html(url_link)[0]
                            pitcher_table = pitcher_table[(pitcher_table['Year'] == '2019') & (pitcher_table['Lg'].isin(['AL', 'NL']))]

                            era = round(pitcher_table.iloc[0]['ERA'],2)
                            whip = round(pitcher_table.iloc[0]['WHIP'],2)

                        except:
                            era = 'N/A'
                            whip = 'N/A'
                        pitchers.append(link.text)
                        era_list.append(era)
                        whip_list.append(whip)
                        print ('%s\tERA: %s\tWHIP: %s' %(link.text, era, whip))

df = pd.DataFrame(list(zip(pitchers, teams, era_list, whip_list)), columns = ['Pitcher', ',Team', 'ERA', 'WHIP'])
print (df)

输出:

print (df)
              Pitcher Team    ERA  WHIP
0      Walker Lockett  NYM  23.14  2.57
1        Jake Arrieta  PHI   4.12  1.38
2         Logan Allen  SDP      0  0.71
3     Jimmy Yacabonis  BAL    4.7  1.44
4     Clayton Richard  TOR   7.46  1.74
5      Glenn Sparkman  KCR   3.62  1.25
6        Shane Bieber  CLE   3.86  1.08
7       Carson Fulmer  CHW   6.35  1.94
8         David Price  BOS   3.39   1.1
9        Jesse Chavez  TEX    N/A   N/A
10  Jordan Zimmermann  DET   6.03  1.37
11       Max Scherzer  WSN   2.62  1.06
12    Trevor Richards  MIA   3.54  1.25
13          Max Fried  ATL   4.03  1.34
14     Adbert Alzolay  CHC   2.25  0.75
15     Marco Gonzales  SEA   4.38  1.37
16        Zach Davies  MIL   3.06  1.36
17    Trevor Williams  PIT   4.12  1.19
18        Gerrit Cole  HOU   3.54  1.02
19        Blake Snell  TBR    4.4  1.24
20        Kyle Gibson  MIN   4.18  1.25
21      Chris Bassitt  OAK   3.64  1.17
22      Jack Flaherty  STL   4.24  1.18
23     Ross Stripling  LAD   3.08  1.17
24         Robbie Ray  ARI   3.87  1.34
25   Chi Chi Gonzalez  COL    N/A   N/A
26  Madison Bumgarner  SFG   4.28  1.24
27        Tyler Mahle  CIN   4.17   1.2
28      Andrew Heaney  LAA   5.68  1.14

相关问题 更多 >