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
[...]