使用名称从网站抓取数据表

道伊

尝试抓取网站时,我遇到了一个特殊情况。我正在通过搜索栏搜索数百个名称,然后抓取表格。但是,有些名称是唯一的,与网站上的名称相比,在我的列表中的拼写有所不同。在这种情况下,我会在网站上手动查找几个名称,但仍然直接将我带到单个页面。其他时候,如果有多个具有相同或相似名字的人(在这种情况下,我想要在nba中打过球的人),则转到名字列表中。我已经考虑了这一点,但是我认为有必要提一下)。我该如何继续进入这些玩家的个人页面,而不必每次都运行脚本并点击错误以查看哪个玩家的拼写稍有不同?再次,即使拼写略有不同或名称列表(在NBA中也需要),数组中的名称也会直接将您带到单个页面。一些示例包括Georgios Papagiannis(在网站上列为George Papagiannis),Ognjen Kuzmic(列为Ognen Kuzmic),Nene(列为Maybyner Nene,但将带您列出姓名-https://basketball.realgm.com/search?q=nene)。这似乎很难,但是我觉得这是可能的。同样,每次将其与下一个播放器一起覆盖时,似乎没有将所有抓取的数据写入到csv中。万分感谢。

我得到的错误: AttributeError: 'NoneType' object has no attribute 'text'

import requests
from bs4 import BeautifulSoup
import pandas as pd


playernames=['Carlos Delfino', 'Nene', 'Yao Ming', 'Marcus Vinicius', 'Raul Neto', 'Timothe Luwawu-Cabarrot']

result = pd.DataFrame()
for name in playernames:

    fname=name.split(" ")[0]
    lname=name.split(" ")[1]
    url="https://basketball.realgm.com/search?q={}+{}".format(fname,lname)
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    if soup.find('a',text=name).text==name:
        url="https://basketball.realgm.com"+soup.find('a',text=name)['href']
        print(url)
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'lxml')

    try:
        table1 = soup.find('h2',text='International Regular Season Stats - Per Game').findNext('table')
        table2 = soup.find('h2',text='International Regular Season Stats - Advanced Stats').findNext('table')

        df1 = pd.read_html(str(table1))[0]
        df2 = pd.read_html(str(table2))[0]

        commonCols = list(set(df1.columns) & set(df2.columns))
        df = df1.merge(df2, how='left', on=commonCols)
        df['Player'] = name
        print(df)
    except:
        print ('No international table for %s.' %name)
        df = pd.DataFrame([name], columns=['Player'])

result = result.append(df, sort=False).reset_index(drop=True)

cols = list(result.columns)
cols = [cols[-1]] + cols[:-1]
result = result[cols]
result.to_csv('international players.csv', index=False)
服务

我对名字相似的NBA球员使用循环。您可以在下面的CSS选择器下面找到,以从搜索表中获取NBA球员:

.tablesaw tr:has(a[href*="/nba/teams/"]) a[href*="/player/"]

CSS选择器的含义:按tablesaw类查找表,查找表的tr子项a及其href包含/nba/teams/文本的子项,然后查找ahref包含的项/player/

我添加了“搜索播放器名称”和“真实播放器名称”列,您可以看到如何找到播放器。该列用作第一和第二列insert(请参见代码中的注释)。

import requests
from bs4 import BeautifulSoup
import pandas as pd
from pandas import DataFrame

base_url = 'https://basketball.realgm.com'
player_names = ['Carlos Delfino', 'Nene', 'Yao Ming', 'Marcus Vinicius', 'Raul Neto', 'Timothe Luwawu-Cabarrot']

result = pd.DataFrame()


def def get_player_stats(search_name = None, real_name = None, player_soup = None):
    table_per_game = player_soup.find('h2', text='International Regular Season Stats - Per Game')
    table_advanced_stats = player_soup.find('h2', text='International Regular Season Stats - Advanced Stats')

    if table_per_game and table_advanced_stats:
        print('International table for %s.' % search_name)

        df1 = pd.read_html(str(table_per_game.findNext('table')))[0]
        df2 = pd.read_html(str(table_advanced_stats.findNext('table')))[0]

        common_cols = list(set(df1.columns) & set(df2.columns))
        df = df1.merge(df2, how='left', on=common_cols)

        # insert name columns for the first positions
        df.insert(0, 'Search Player Name', search_name)
        df.insert(1, 'Real Player Name', real_name)
    else:
        print('No international table for %s.' % search_name)
        df = pd.DataFrame([[search_name, real_name]], columns=['Search Player Name', 'Real Player Name'])

    return df


for name in player_names:
    url = f'{base_url}/search?q={name.replace(" ", "+")}'
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    if url == response.url:
        # Get all NBA players
        for player in soup.select('.tablesaw tr:has(a[href*="/nba/teams/"]) a[href*="/player/"]'):
            response = requests.get(base_url + player['href'])
            player_soup = BeautifulSoup(response.content, 'lxml')
            player_data = get_player_stats(search_name=player.text, real_name=name, player_soup=player_soup)
            result = result.append(player_data, sort=False).reset_index(drop=True)
    else:
        player_data = get_player_stats(search_name=name, real_name=name, player_soup=soup)
        result = result.append(player_data, sort=False).reset_index(drop=True)

result.to_csv('international players.csv', index=False)
# Append to existing file
# result.to_csv('international players.csv', index=False, mode='a')

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用VBA抓取历史数据表

来自分类Dev

使用VBA从网站中抓取数据

来自分类Dev

使用CSS样式使用Beautifull汤从网站中抓取数据

来自分类Dev

jQuery数据表columnDefs以名称而非索引为目标

来自分类Dev

Kibana缩短数据表中的列名称

来自分类Dev

无法序列化数据表。未设置数据表名称

来自分类Dev

使用Python BeautifulSoup从具有多个相同名称表的特定页面提取数据表

来自分类Dev

如何使用PHP抓取HTML表数据

来自分类Dev

从网站下载多个数据表

来自分类Dev

使用Python从.ASPX网站URL抓取数据

来自分类Dev

使用VBA抓取历史数据表

来自分类Dev

对数据属性使用数据表

来自分类Dev

Laravel数据表服务使用具有不同名称的关系

来自分类Dev

JQuery数据表中的动态列名称

来自分类Dev

如何使用SQL Server替换数据表中的名称

来自分类Dev

如何使用正则表达式在数据表中查找名称

来自分类Dev

显示包含数据库表名称的数据表

来自分类Dev

按月份名称列对数据表进行排序

来自分类Dev

Kibana缩短数据表中的列名称

来自分类Dev

使用for循环从数据表访问数据

来自分类Dev

如何使用R从网站抓取Web表

来自分类Dev

从网页抓取数据表和数据

来自分类Dev

数据表:在 RTL 网站中使用 Bootstrap 对日期排序效果不佳

来自分类Dev

使用 PrimeNG 数据表

来自分类Dev

使用数据表搜索表

来自分类Dev

如何从 AJAX 密集型网站抓取数据表?

来自分类Dev

使用 Ajax 的数据表

来自分类Dev

使用 BeautifulSoup 从网站抓取数据的问题

来自分类Dev

抓取使用javascript插入的iframe数据表