pandas 如何设置从多个页面中抓取数据的功能?

carvr3hs  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(84)

我试图从巴西的一个法院那里收集一些数据(是的,这是法律的的),一切都很顺利,除了一件事:我无法设置一个功能,点击按钮改变页面,重新做刮代码,并添加数据到df(我试图使用var设置为刮+.append(),没有成功-我使用它正确吗?)
有什么建议吗
MWE:

import time
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options

url = "https://scon.stj.jus.br/SCON/legaplic/toc.jsp?materia=%27Lei+8.429%2F1992+%28Lei+DE+IMPROBIDADE+ADMINISTRATIVA%29%27.mat.&b=TEMA&p=true&t=&l=1&i=18&ordem=MAT,@NUM"

option = Options()
option.headless = True
driver = webdriver.Firefox()

driver.get(url)
time.sleep(5)

driver.find_element(by=By.LINK_TEXT, value='§ 6o A ação será instruída com documentos ou justificação que contenham indícios suficientes da existência do ato de improbidade ou com razões fundamentadas da impossibilidade de apresentação de qualquer dessas provas, observada a legislação vigente, inclusive as disposições inscritas nos arts. 16 a 18 do Código de Processo Civil. (Incluído pela Medida Provisória nº 2.225-45, de 2001)').click()

time.sleep(5)

driver.switch_to.window(driver.window_handles[-1]) # Change the focus to the new page, otherwise I can not scrap its content

element = driver.find_element(by=By.CLASS_NAME, value="listadocumentos")
html_content = element.get_attribute('outerHTML')

resultados = BeautifulSoup(driver.page_source, 'lxml')
paragrafoBRS = resultados.find_all('div', attrs={'class':'paragrafoBRS'})

driver.find_element(by=By.CLASS_NAME, value='iconeProximaPagina.temHint').click()

resultados # Also tried resultados.append()
paragrafoBRS # Also tried paragrafoBRS.append()

driver.quit()

header = []
content = []

for each in paragrafoBRS:
    header.append(each.find('div', {'class':'docTitulo'}).text)
    content.append(each.find(['div','pre'], {'class':'docTexto'}).text)

dataDict = {}
df = pd.DataFrame()

for i in range(len(header)):
    if header[i] in dataDict:
        df = df.append(pd.DataFrame(dataDict), ignore_index=True)
        dataDict = {}

    dataDict[header[i]] = [content[i]]

df.to_excel('data.xlsx')
x8diyxa7

x8diyxa71#

click()之后,selenium会自动更新driver.page_source,但不会更新resultados和其他变量,您必须再次运行

resultados = BeautifulSoup(driver.page_source, 'lxml') 
# rest

这将替换旧的内容,因此您应该首先运行for each in paragrafoBRS:从第一页获取数据,然后运行click(),然后再次加载resultados并再次运行for each in paragrafoBRS:从下一页获取数据。
就像这样:

import time
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options

url = "https://scon.stj.jus.br/SCON/legaplic/toc.jsp?materia=%27Lei+8.429%2F1992+%28Lei+DE+IMPROBIDADE+ADMINISTRATIVA%29%27.mat.&b=TEMA&p=true&t=&l=1&i=18&ordem=MAT,@NUM"

option = Options()
option.headless = True
driver = webdriver.Firefox()

driver.get(url)
time.sleep(5)

driver.find_element(by=By.LINK_TEXT, value='§ 6o A ação será instruída com documentos ou justificação que contenham indícios suficientes da existência do ato de improbidade ou com razões fundamentadas da impossibilidade de apresentação de qualquer dessas provas, observada a legislação vigente, inclusive as disposições inscritas nos arts. 16 a 18 do Código de Processo Civil. (Incluído pela Medida Provisória nº 2.225-45, de 2001)').click()

time.sleep(5)

driver.switch_to.window(driver.window_handles[-1]) # Change the focus to the new page, otherwise I can not scrap its content

element = driver.find_element(by=By.CLASS_NAME, value="listadocumentos")
html_content = element.get_attribute('outerHTML')

# --- before all pages --

header = []
content = []

# --- get data from first page --

resultados = BeautifulSoup(driver.page_source, 'lxml')
paragrafoBRS = resultados.find_all('div', attrs={'class':'paragrafoBRS'})

for each in paragrafoBRS:
    header.append(each.find('div', {'class':'docTitulo'}).text)
    content.append(each.find(['div','pre'], {'class':'docTexto'}).text)

print('len(content):', len(content))

# --- load next page ---

print('click')
driver.find_element(by=By.CLASS_NAME, value='iconeProximaPagina.temHint').click()

time.sleep(5)

# --- get data from next page --

resultados = BeautifulSoup(driver.page_source, 'lxml')
paragrafoBRS = resultados.find_all('div', attrs={'class':'paragrafoBRS'})

for each in paragrafoBRS:
    header.append(each.find('div', {'class':'docTitulo'}).text)
    content.append(each.find(['div','pre'], {'class':'docTexto'}).text)

print('len(content):', len(content))

# ---

driver.quit()

dataDict = {}
df = pd.DataFrame()

for i in range(len(header)):
    if header[i] in dataDict:
        df = df.append(pd.DataFrame(dataDict), ignore_index=True)
        dataDict = {}

    dataDict[header[i]] = [content[i]]

df.to_excel('data.xlsx')

编辑:

我无法测试它,因为服务器拒绝连接在这一刻。
如果你想在for循环中运行得到ie。5页

# ... code ...

# --- before all pages --

header = []
content = []

# --- loop ---

for n in range(5):
    print('--- page:', n+1, '---')

    # --- get data from page --
    
    resultados = BeautifulSoup(driver.page_source, 'lxml')
    paragrafoBRS = resultados.find_all('div', attrs={'class':'paragrafoBRS'})
    
    for each in paragrafoBRS:
        header.append(each.find('div', {'class':'docTitulo'}).text)
        content.append(each.find(['div','pre'], {'class':'docTexto'}).text)
    
    print('len(content):', len(content))
    
    # --- load next page ---
    
    print('click')
    driver.find_element(by=By.CLASS_NAME, value='iconeProximaPagina.temHint').click()
    
    time.sleep(5)

# --- after loop ---

driver.quit()

dataDict = {}
df = pd.DataFrame()

# ... code ...

如果你想在while-loop中运行以获取所有页面。
我使用try/except来检测点击链接到下一页时出现的问题-然后我使用break退出循环

# ... code ...

# --- before all pages --

header = []
content = []

# --- loop ---

page = 0

while True:
    
    page += 1
    
    print('--- page:', page, '---')
    
    # --- get data from page --
    
    resultados = BeautifulSoup(driver.page_source, 'lxml')
    paragrafoBRS = resultados.find_all('div', attrs={'class':'paragrafoBRS'})
    
    for each in paragrafoBRS:
        header.append(each.find('div', {'class':'docTitulo'}).text)
        content.append(each.find(['div','pre'], {'class':'docTexto'}).text)
    
    print('len(content):', len(content))
    
    # --- load next page ---
    
    try:
        print('click')
        driver.find_element(by=By.CLASS_NAME, value='iconeProximaPagina.temHint').click()
        
        time.sleep(5)
    except Exception as ex:
        # exit loop when problem with clicking
        print('Exception:', ex)
        break  # exit loop when
    
# --- after loop ---

driver.quit()

dataDict = {}
df = pd.DataFrame()

# ... code ...

相关问题