Home > Back-end >  python scrapin .aspx from cbi
python scrapin .aspx from cbi

Time:08-11

I'm beginner in python and I am trying to scrapping a link from central bank of Iran. i tried this:

import requests
from bs4 import BeautifulSoup

r_obj = requests.Session()

url = "https://www.cbi.ir/PolicyRates/policyrates_fa.aspx"

fr_soup = r_obj.get(url)
print(fr_soup)


soup = BeautifulSoup(fr_soup.content , "lxml")
print(soup)

l = soup.find_all("input",type="hidden")
print(l)

data = {
l[0]['name']:l[0]['value'],
l[1]['name']:l[1]['value'],
'btnAccept':'Yes, I accept'}

r_obj.post(url,verify=False,data=data)

url_needed = "https://www.cbi.ir/PolicyRates/policyrates_fa.aspx"

final = r_obj.get(url_needed)

but I got this:

IndexError                                Traceback (most recent call last)
Input In [7], in <cell line: 19>()
     15 l = soup.find_all("input",type="hidden")
     16 print(l)
     18 data = {
---> 19 l[0]['name']:l[0]['value'],
     20 l[1]['name']:l[1]['value'],
     21 'btnAccept':'Yes, I accept'}
     23 r_obj.post(url,verify=False,data=data)
     25 url_needed = "https://www.cbi.ir/PolicyRates/policyrates_fa.aspx"

IndexError: list index out of range

and i don't know about value!

i want to get this table and then use pandas. Thanks,

CodePudding user response:

As that page is generated by a js script, here is a solution based off selenium/chromedriver. You will probably need to install selenium, download chromedriver executable, and set everything up depending on your machine/OS. There are many easy to follow tutorials on the net, and also, the Selenium documentation can be found here: https://www.selenium.dev/documentation/

The following code will get all three tables from that page:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time as t
import pandas as pd


chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument('disable-notifications')


webdriver_service = Service("chromedriver/chromedriver") ## path to where you saved chromedriver binary
browser = webdriver.Chrome(service=webdriver_service, options=chrome_options)

url = 'https://www.cbi.ir/PolicyRates/policyrates_fa.aspx'

browser.get(url) 

for x in range(3):
    select_element = Select(WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@id='ctl00_ucBody_ucContent_ctl00_ddlYear']"))))

    select_element.select_by_index(x)
    t.sleep(5)
    table_element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ctl00_ucBody_ucContent_ctl00_divRates']/table")))
    df = pd.read_html(table_element.get_attribute('outerHTML'))[0]
    print(f'TABLE {x}')
    print(df)

This will return:

TABLE 0
تاریخ   نرخ بازار بین‌بانکی(%)  حداقل نرخ توافق بازخرید(%)  نرخ اعتبارگیری قاعده​‌مند(%)    نرخ سپرده‌گذاری قاعده‌​مند(%)
0   ۱۴۰۱/۰۵/۱۳  20.64   20  22  14
1   ۱۴۰۱/۰۵/۱۲  20.64   20  22  14
2   ۱۴۰۱/۰۵/۰۶  21.13   21.5    22  14
3   ۱۴۰۱/۰۴/۳۰  21.31   21.21   22  14
4   ۱۴۰۱/۰۴/۲۳  21.14   20.91   22  14
5   ۱۴۰۱/۰۴/۱۶  20.95   20.3    22  14
6   ۱۴۰۱/۰۴/۰۹  20.85   19.8    22  14
7   ۱۴۰۱/۰۴/۰۲  20.82   19.5    22  14
8   ۱۴۰۱/۰۳/۲۶  20.68   19.3    22  14
9   ۱۴۰۱/۰۳/۱۹  20.57   19.2    22  14
10  ۱۴۰۱/۰۳/۱۲  20.55   19.1    22  14
11  ۱۴۰۱/۰۳/۰۵  20.59   19.01   22  14
12  ۱۴۰۱/۰۲/۲۹  20.57   19  22  14
13  ۱۴۰۱/۰۲/۲۲  20.45   19  22  14
14  ۱۴۰۱/۰۲/۱۵  20.44   19  22  14
15  ۱۴۰۱/۰۲/۰۸  20.40   19  22  14
16  ۱۴۰۱/۰۲/۰۱  20.36   19  22  14
17  ۱۴۰۱/۰۱/۲۵  20.29   19  22  14
18  ۱۴۰۱/۰۱/۱۸  20.30   19  22  14
19  ۱۴۰۱/۰۱/۱۱  20.36   -   22  14
TABLE 1
تاریخ   نرخ بازار بین‌بانکی(%)  حداقل نرخ توافق بازخرید(%)  نرخ اعتبارگیری قاعده​‌مند(%)    نرخ سپرده‌گذاری قاعده‌​مند(%)
0   ۱۴۰۰/۱۲/۲۶  20.28   19  22  14
1   ۱۴۰۰/۱۲/۱۹  20.25   19  22  14
2   ۱۴۰۰/۱۲/۱۲  20.30   19  22  14
3   ۱۴۰۰/۱۲/۰۵  20.33   19  22  14
4   ۱۴۰۰/۱۱/۲۸  20.26   19  22  14
5   ۱۴۰۰/۱۱/۲۱  20.31   19  22  14
6   ۱۴۰۰/۱۱/۱۴  20.39   19.2    22  14
7   ۱۴۰۰/۱۱/۰۷  20.45   19.2    22  14
8   ۱۴۰۰/۱۰/۳۰  20.48   19.3    22  14
9   ۱۴۰۰/۱۰/۲۳  20.50   19.3    22  14
10  ۱۴۰۰/۱۰/۱۶  20.85   19.3    22  14
11  ۱۴۰۰/۱۰/۰۹  21.11   20.15   22  14
12  ۱۴۰۰/۱۰/۰۲  21.08   20.15   22  14
13  ۱۴۰۰/۰۹/۲۵  21.04   20.15   22  14
14  ۱۴۰۰/۰۹/۱۸  21.05   20.15   22  14
[...]
  • Related