You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python抓取URL固定的网站多页数据?附失效代码求助

问题描述

我编写了三个Python程序,尝试抓取https://www.bseindia.com/markets/debt/TradenSettlement.aspx这个固定网址的多页债务交易结算数据,要求不使用Selenium。此前用同类程序在其他网站可正常抓取,但这三个程序均失效,该网站页数超过10页,希望解决抓取所有页面数据的问题。


程序1

import requests
from bs4 import BeautifulSoup
import pandas as pd
import os
import os.path
import datetime
import schedule      
import time

dt = str(datetime.date.today())
today = datetime.datetime.now()
#date_time = today.strftime("%m/%d/%Y_%H_%M_%S")
date_time = today.strftime("%d-%m-%Y_%H.%M")
print("date and time:",date_time)
file_name = 'BSE_Trades_' + date_time


save_path = r"C:\Users\ABCD"              
path = os.path.join(save_path, file_name+".csv")  

url = "https://www.bseindia.com/markets/debt/TradenSettlement.aspx"

#headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52"}


dfs = pd.read_html(url)                                                                                                         
df = dfs[-2]

print(df)

count_row = df.shape[0]

data = {                             
    "__EVENTTARGET" : "",
    '__EVENTARGUMENT': '',  
    "__VIEWSTATE" : "",
    "__VIEWSTATEGENERATOR": "",
    "__VIEWSTATEENCRYPTED": "",
    "__EVENTVALIDATION": "",
    
       }

def updateData(response):
    global data
    soup = BeautifulSoup(response.content, 'html.parser')
    for i in data:
        try:
            data[i] = soup.find("input", id=i).get("value")
        except:
             pass
            
def main(url):
    global data
    targetString = "ctl00$ContentPlaceHolder1$GridViewrcdsFC"
    with requests.Session() as req:
        r = req.get(url)
        df = pd.read_html(r.content, attrs={
                      'id': 'ContentPlaceHolder1_divCT1'}) [0]          

       # 打印第一页表格
        print(df)
        
        # 获取最后一列的最后一个元素,这里存储了总页数
      
        
        try: pageLength = int(df[0][count_row-1][-2])
        except: pageLength=int(df[0][count_row-2][-2])
        else: pageLength = int(df[0][count_row-1][-2])
               

        #try: pageLength = 22
        #except: pageLength = 0
        #else: pageLength = 22
        

        updateData(r)
                
        for pageNumber in range(1,pageLength):
            
            data["__EVENTTARGET"] = targetString #+str(pageNumber)
            data["__EVENTARGUMENT"] = "Page$" + str(pageNumber) #+str(pageNumber)
            data["__VIEWSTATEGENERATOR"] = "1BDEC9B0"
            
            r = req.post(url ,  data=data)
            
            _df = pd.read_html(r.content, attrs={
                          'id': 'ContentPlaceHolder1_divCT1'}) [0]          
            updateData(r)        
            df = df.append(_df)
            print (df)
      
        df.to_csv(path)

main("https://www.bseindia.com/markets/debt/TradenSettlement.aspx")

程序2

import json

import pandas as pd
import requests
import datetime
#from datetime import datetime
import os
import os.path
import schedule      
import time


dt = str(datetime.date.today())
today = datetime.datetime.now()
date_time = today.strftime("%d-%m-%Y_%H.%M")
print("date and time:",date_time)
file_name = 'BSE_Data_' + date_time

save_path = r"C:\Users\XYZ"              
path = os.path.join(save_path, file_name+".csv")


endpoint = "https://www.bseindia.com/markets/debt/TradenSettlement.aspx"

headers = {
    #"pageToken": "f06c7498-ac12-4def-95d2-f0fb903fff64",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52",
    #"X-Requested-With": "XMLHttpRequest",
}

#实际网站里没有Payload,我自己创建了一个

Payload = {
    "columnNames": [
        "Deal Type*(Brokered/Direct/IST)", "ISIN", "Listed/Unlisted security", "Issuer Name", "Coupon (%)",
        "Issue Description", "Traded Price in Rs", "Trade yield (%)", "Yield Type (YTC/YTP/YTM)#",
        "Yield Date", "Trade Value in Rs. Lacs (in face value term)", "Trade Date & Time", "Settlement Date", "Reported trade/Trade executed on RFQ platform",
        "Settlement Status^(Settled/Not Settled/Pending)", "Outside Yield Range",
    ]
}


response = requests.post(endpoint, data=json.dumps(Payload), headers=headers)

df = pd.DataFrame(response.json(), columns=Payload["columnNames"])

print(df)

df.to_csv(path, index=False)

程序3(尝试用Fire Command翻页仍无效)

import requests
from bs4 import BeautifulSoup
import pandas as pd

data = {
    
    '__EVENTTARGET': "ctl00$ContentPlaceHolder1$GridViewrcdsFC",
    '__EVENTARGUMENT': 'FireCommand:Page$1;PageSize;50',
    '__VIEWSTATE': "",
    '__VIEWSTATEGENERATOR': '1BDEC9B0',
    '__VIEWSTATEENCRYPTED':"",
    '__EVENTVALIDATION':"moMXnWZxj4bZurveAGmOcL0nISClexUE9Z2uw4xpvBOm1MGb2OcWpeoR93Q2hSbZNPFrA13DJe+gToc4zKmJCrAz6mtps/4+Fuc55oo04aW5LAcfpXgJF4F9dtA80NIp6P5vueUYd7iUSQ1sGEnNlWQcghy//kGSS09BCEGrF6iX+zA/9P4X3Yjd8zLJRKyMbAYzKHPVaNNw1QovP7EsqwBhzHWN7R9IjuSvXBwbDC8Gtxkb8JmOx8Uh5ohoih8EmxSjHEjThJY79RbzkRBRzA==",
    
}


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


main("https://www.bseindia.com/markets/debt/TradenSettlement.aspx")

内容的提问来源于stack exchange,提问作者New_Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:35:36