使用单个 URL 抓取多个页面上的表

2023-12-01

我正在尝试从 Fangraph 中抓取数据。这些表分为 21 个页面,但所有页面都使用相同的 URL。我对网络抓取(或一般的Python)非常陌生,但Fangraphs没有公共API,所以抓取页面似乎是我唯一的选择。我目前正在使用 BeautifulSoup 来解析 HTML 代码,并且我能够抓取初始表,但它只包含前 30 个玩家,但我想要整个玩家池。网上搜索了两天,我被困住了。链接和我当前的代码如下。我知道他们有一个下载 csv 文件的链接,但这在整个赛季都会变得乏味,我想加快数据收集过程。任何方向都会有帮助,谢谢。

import requests
import pandas as pd

url = 'https://www.fangraphs.com/projections.aspx?pos=all&stats=bat&type=fangraphsdc&team=0&lg=all&players=0'

response = requests.get(url, verify=False)

# Use BeautifulSoup to parse the HTML code
soup = BeautifulSoup(response.content, 'html.parser')

# changes stat_table from ResultSet to a Tag
stat_table = stat_table[0]

# Convert html table to list
rows = []
for tr in stat_table.find_all('tr')[1:]:
    cells = []
    tds = tr.find_all('td')
    if len(tds) == 0:
        ths = tr.find_all('th')
        for th in ths:
            cells.append(th.text.strip())
    else:
        for td in tds:
            cells.append(td.text.strip())
    rows.append(cells)

# convert table to df
table = pd.DataFrame(rows)

import requests
from bs4 import BeautifulSoup
import pandas as pd

params = {
    "pos": "all",
    "stats": "bat",
    "type": "fangraphsdc"
}

data = {
    'RadScriptManager1_TSM': 'ProjectionBoard1$dg1',
    "__EVENTTARGET": "ProjectionBoard1$dg1",
    '__EVENTARGUMENT': 'FireCommand:ProjectionBoard1$dg1$ctl00;PageSize;1000',
    '__VIEWSTATEGENERATOR': 'C239D6F0',
    '__SCROLLPOSITIONX': '0',
    '__SCROLLPOSITIONY': '1366',
    "ProjectionBoard1_tsStats_ClientState": "{\"selectedIndexes\":[\"0\"],\"logEntries\":[],\"scrollState\":{}}",
    "ProjectionBoard1_tsPosition_ClientState": "{\"selectedIndexes\":[\"0\"],\"logEntries\":[],\"scrollState\":{}}",
    "ProjectionBoard1$rcbTeam": "All+Teams",
    "ProjectionBoard1_rcbTeam_ClientState": "",
    "ProjectionBoard1$rcbLeague": "All",
    "ProjectionBoard1_rcbLeague_ClientState": "",
    "ProjectionBoard1_tsProj_ClientState": "{\"selectedIndexes\":[\"5\"],\"logEntries\":[],\"scrollState\":{}}",
    "ProjectionBoard1_tsUpdate_ClientState": "{\"selectedIndexes\":[],\"logEntries\":[],\"scrollState\":{}}",
    "ProjectionBoard1$dg1$ctl00$ctl02$ctl00$PageSizeComboBox": "30",
    "ProjectionBoard1_dg1_ctl00_ctl02_ctl00_PageSizeComboBox_ClientState": "",
    "ProjectionBoard1$dg1$ctl00$ctl03$ctl01$PageSizeComboBox": "1000",
    "ProjectionBoard1_dg1_ctl00_ctl03_ctl01_PageSizeComboBox_ClientState": "{\"logEntries\":[],\"value\":\"1000\",\"text\":\"1000\",\"enabled\":true,\"checkedIndices\":[],\"checkedItemsTextOverflows\":false}",
    "ProjectionBoard1_dg1_ClientState": ""
}


def main(url):
    with requests.Session() as req:
        r = req.get(url, params=params)
        soup = BeautifulSoup(r.content, 'html.parser')
        data['__VIEWSTATE'] = soup.find("input", id="__VIEWSTATE").get("value")
        data['__EVENTVALIDATION'] = soup.find(
            "input", id="__EVENTVALIDATION").get("value")
        r = req.post(url, params=params, data=data)
        df = pd.read_html(r.content, attrs={
                          'id': 'ProjectionBoard1_dg1_ctl00'})[0]
        df.drop(df.columns[1], axis=1, inplace=True)
        print(df)
        df.to_csv("data.csv", index=False)


main("https://www.fangraphs.com/projections.aspx")

Output: 在线查看

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用单个 URL 抓取多个页面上的表 的相关文章

随机推荐

  • 使用 shell 脚本仅从 sftp 获取最新文件

    我只需要按照日期从 sftp 获取最新文件 例如 yyyy mm dd 我尝试了较低的命令 但它将获取目录中的所有文件 latest file ls ltr tail 1 awk print 9 scp r latest file user
  • 依赖于私有 AZ 存储库的 Azure 构建管道

    我们在 Azure 存储库中有一个 Angular 项目 它引用依赖项下的 packages json 文件中的另一个私有 Azure 项目 存储库 该项目在本地为所有开发人员构建良好 但在 Azure Pipeline 中失败 身份验证失
  • oracle程序创建并运行ora-00900错误

    我在 dbeaver 中做了这样的 oracle 程序 CREATE OR REPLACE PROCEDURE p test IS I MESSAGE VARCHAR2 100 test BEGIN dbms output put line
  • C++ - 最佳实践:“使用 std::cout” 与“std::cout” [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我知道 在 C 中 我们永远不应该使用 using namespace std 两种可能的替代方案是 1 添加using std cout 在文件的开头 然后输入cout每当需要时 2 t
  • 是否可以在 PHP 中创建静态类(就像在 C# 中一样)?

    我想在 PHP 中创建一个静态类 并让它像在 C 中一样运行 所以 第一次调用类时会自动调用构造函数 无需实例化 诸如此类的东西 static class Hello private static greeting Hello privat
  • 在 cakephp 2 的行为中读取会话变量

    我有一种行为可以根据会话中存储的用户 ID 来隔离用户数据 在 CakePHP 1 3 中你可以这样做 App import Component Session session new SessionComponent session gt
  • 验证在单元测试中调用了一种方法或另一种方法

    Example public bool Save MyObj instance if instance IsNew this repository Create instance else this repository Update in
  • 带有 nginx ssl 直通的反向代理

    我有多个 ISS Web 服务器 在每个 IIS 服务器上托管多个 Web 应用程序 每个系统上都有一个公共证书 每个 IIS 都有一个唯一的 IP 所有IIS服务器都放置在同一个DMZ中 我在另一个 DMZ 中设置了 nginx 系统 我
  • R 中显示的摘要很短,许多术语显示为“其他”

    如何显示完整的输出摘要 而不将任何值分类为 其他 summary d Date of Sale City Department Product 1 18 2015 149 A 5290 Footwear Mens 538 13245 255
  • 如何使用 Vertx JDBC Client 使用列表作为 SQL 查询的参数源?

    我有一个 Vert x Web 应用程序 需要查询运行 Postgres 10 7 的 AWS RDS 实例 Vert x JDBC 客户端是io vertx vertx jdbc client 3 8 4 我想查询一个表 其约束条件是某个
  • 清算意图

    我的 Android 应用程序被传递信息的意图 状态栏中的待定意图 调用 当我按下主页按钮并按住主页按钮重新打开我的应用程序时 它会再次调用意图 并 且相同的附加功能仍然存在 Override public void onSaveInsta
  • android Volley如何发布多个参数

    如何发布多个参数android Volley 发布多个数组 如 101 102 103 params put sessionid 101 102 103 就像 任何其他方式 public void postCompanyArticle St
  • 没有选择 emacs ido 所建议的内容? [复制]

    这个问题在这里已经有答案了 在我当前的工作目录中 WD有一个abc txt文件 现在我想做另一个abc txt子目录下 WD NEW 当我打字时C x C f和目录 WD NEW abc txt ido 正在将字符串更改为 WD abc t
  • 如何为 scikit-learn 提供随机数生成器的种子?

    我正在尝试为一些使用 scikit learn 的代码编写单元测试 然而 我的单元测试似乎是不确定的 AFAIK 我的代码中 scikit learn 使用随机性的唯一地方是它的LogisticRegression模型及其train tes
  • 如何将两个不同的域名指向同一个网站? [关闭]

    Closed 这个问题是无关 目前不接受答案 我有一个网站 但这个网站没有完整的域名 但在互联网上排名很好 我想让这个网站由两个不同的域名指向 请建议我该怎么做 请给我简单的步骤来做到这一点 Thanks 在每个域下 您应该有 DNS 设置
  • 如何从命令行构建 MSIX [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我们已经了解 MSIX 是 ClickOnce 的一个有趣的现代替代品 与 GUI 一起使用运行流畅 我们还希望将其与 Powershell CMD 脚本一起使用 我们只想要 m
  • (字符串)文字的范围

    我总是尽量避免返回字符串文字 因为我担心它们没有在函数外部定义 但我不确定情况是否如此 我们以这个函数为例 const char return a string void return blah 这是正确的代码吗 它确实对我有用 但也许它只
  • 就像 MySQL 中区分大小写一样

    我有一个 MySQL 查询 SELECT concat ws title description as concatenated HAVING concatenated LIKE SearchTerm 我的表是用 MyISAM 编码的 ut
  • 使用原始音乐数组进行循环 android

    我目前正在尝试创建一个 for 循环 在该循环中它将播放原始文件 完成后 它将继续播放数组中的下一个声音文件 目前它正在一次播放所有文件 关于如何解决这个问题有什么建议吗 我认为完成监听器可能有问题 但不确定 谢谢 my Code pack
  • 使用单个 URL 抓取多个页面上的表

    我正在尝试从 Fangraph 中抓取数据 这些表分为 21 个页面 但所有页面都使用相同的 URL 我对网络抓取 或一般的Python 非常陌生 但Fangraphs没有公共API 所以抓取页面似乎是我唯一的选择 我目前正在使用 Beau