[英]Web scraping after clicking on two buttons
我正在嘗試通過單擊 2 個單選按鈕從該網站http://rgphentableaux.hcp.ma/Default1/抓取數據,然后從這樣的列表中選擇在此處輸入圖像描述
我需要為該列表中的所有可用選項執行此操作,並將表格添加到 dataframe 我這里是我迄今為止嘗試過的,但它沒有用
from bs4 import BeautifulSoup
pip install selenium
from selenium import webdriver
browser=webdriver.Chrome()
url = "http://rgphentableaux.hcp.ma/Default1/"
browser.get(url) #navigate to the page
browser.find_element_by_xpath(".//input[@type='radio' and
@value='5']").click()
browser.find_element_by_id("CGEO").click()
time.sleep(3)
browser.find_element_by_xpath(".//input[@type='button' and
@value='Afficher']").click()
tabs = browser.find_elements_by_id('IEE')
innerHTML = browser.execute_script("return
document.body.innerHTML")
soup_level2=BeautifulSoup(innerHTML, 'html.parser')
您可以通過模仿頁面發出的請求來使用requests
和bs4
完成所有工作。 您只需要以正確的順序循環區域,並將當前區域編號添加到每個請求中的'CGEO'
參數。
這個:
soup = bs(s.get(url).content, 'lxml')
regions = [i.text.strip() for i in soup.select('#REGIONSLIST option')]
從登陸 url 收集區域名稱的初始列表。
這個:
for k,v in regions.items():
params = (('type', 'Region'), ('CGEO', v), ('them', '5'))
使用區域的option
標簽value
屬性設置CGEO
參數,例如Tanger-Tetouan-Al Hoceima
是'01'
。
Region
選項在type
參數中設置。
Langues locales utilisées
選項在them
參數中設置,即'5'
。
這個:
for y in range(3):
row.extend([data[i-y+2]['DATA2014']])
只是顛倒項目的順序,以便將data
中每個字典中的Ens, Fem, Masc
添加到所需的 output 順序的row
中 Masc, Masc, Fem, Ens
。
派:
import requests
import pandas as pd
from bs4 import BeautifulSoup as bs
def add_rows(region, data):
for i in range(0, len(data)//3, 3):
row = [region, data[i]['INDICATEUR'].split('_')[-1]]
for y in range(3):
row.extend([data[i-y+2]['DATA2014']])
final.append(row)
url = 'http://rgphentableaux.hcp.ma/Default1'
headers= {'User-Agent': 'Mozilla/5.0', 'Referer': url}
final = []
with requests.Session() as s:
s.headers = headers
soup = bs(s.get(url).content, 'lxml')
regions = {i.text.strip():i['value'].strip() for i in soup.select('#REGIONSLIST option')}
for k,v in regions.items():
params = (('type', 'Region'), ('CGEO', v), ('them', '5'))
r = s.get(f'{url}/getDATA/', params=params)
data = r.json()
add_rows(k, data)
df = pd.DataFrame(final, columns = ['Region', 'Lang', 'Masc', 'Fem', 'Ens'])
print(df)
編輯:
要獲得所有 3 個表(合奏、城市、農村),請調整自定義 function,如下所示,並for n in range(0, len(data), block)
添加附加循環:
import requests
import pandas as pd
from bs4 import BeautifulSoup as bs
def add_rows(table, region, data_block):
for i in range(0, len(data_block), 3):
row = [table, region, data_block[i]['INDICATEUR'].split('_')[-1]]
for y in range(3):
row.extend([data_block[i-y+2]['DATA2014']])
final.append(row)
url = 'http://rgphentableaux.hcp.ma/Default1'
headers= {'User-Agent': 'Mozilla/5.0', 'Referer': url}
tables = ['ens', 'urb', 'rur']
final = []
with requests.Session() as s:
s.headers = headers
soup = bs(s.get(url).content, 'lxml')
regions = {i.text.strip():i['value'].strip() for i in soup.select('#REGIONSLIST option')}
for k,v in regions.items():
params = (('type', 'Region'), ('CGEO', v), ('them', '5'))
r = s.get(f'{url}/getDATA/', params=params)
data = r.json()
block = len(data)//3
for n in range(0, len(data), block):
table = tables[n//block]
add_rows(table, k, data[n:n+block])
df = pd.DataFrame(final, columns = ['Table', 'Region', 'Language', 'Masc', 'Fem', 'Ens'])
print(df)
將 select 項目與文本作為語言區域設置使用和區域並刮表您可以使用以下解決方案:
driver.get("http://rgphentableaux.hcp.ma/Default1/")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@text='Langues locales utilisées']"))).click()
driver.find_element_by_xpath("//input[@value='Region']").click()
driver.execute_script("return arguments[0].scrollIntoView(true);", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@value='Choisir une entitée']"))))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@value='Choisir une entitée']"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//li[contains(., 'Tanger-Tetouan-Al Hoceima')]"))).click()
driver.find_element_by_xpath("//input[@value='Afficher']").click()
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[@class='tableau']/tbody"))).text)
控制台 Output:
Population municipale 16 747 522 16 862 562 33 610 084
Répartition selon les grands groupes d'âges
Moins de 6 ans 12.4 11.8 12.1
De 6 à 14 ans 16.5 15.7 16.1
De 15 à 59 ans 61.8 63.0 62.4
60 ans et plus 9.3 9.5 9.4
Répartition selon le groupe d'âges quinquennal
0-4 ans 10.4 9.9 10.2
5-9 ans 9.2 8.8 9.0
10-14 ans 9.3 8.8 9.0
15-19 ans 8.9 8.8 8.9
20-24 ans 9.0 9.1 9.1
25-29 ans 8.2 8.4 8.3
30-34 ans 7.7 8.0 7.8
35-39 ans 6.8 7.2 7.0
40-44 ans 6.3 6.5 6.4
45-49 ans 5.3 5.6 5.4
50-54 ans 5.3 5.4 5.3
55-59 ans 4.2 4.0 4.1
60-64 ans 3.4 3.3 3.4
65-69 ans 1.9 1.9 1.9
70-74 ans 1.6 1.8 1.7
75 ans et plus 2.4 2.6 2.5
État matrimonial
Célibataire 57.9 48.4 53.2
Marié 40.8 42.0 41.4
Divorcé 0.7 2.4 1.6
Veuf 0.6 7.1 3.9
Âge moyen au premier mariage 31.3 25.7 28.5
Fécondité
Parité moyenne à 45-49 ans / 3.5 /
Indice synthétique de fécondité / 2.2 /
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.