使用Selenium/Beautiful Soup抓取动态网站跳过项目

cnjp1d6j  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(159)

我用美丽的汤和 selenium 的组合刮这个website。该网站有一些动态加载的内容,我需要刮以及。问题是并不是所有的数据都被抓取,因为输出中缺少一些项,因为它们具有相同的名称(但链接中的内容不同,也需要被抓取)。下面是我的代码:

import json
import requests
from bs4 import BeautifulSoup

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.edge.service import Service as EdgeService
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from selenium.webdriver.edge.options import Options

options = Options()
options.add_argument("--start-maximized")

URL = "https://atlantelavoro.inapp.org/atlante_professioni.php"

driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()), options=options)
action_chains = ActionChains(driver)
driver.get(URL)
driver.implicitly_wait(0.5)
elements = driver.find_elements(By.XPATH, "//a[@role='button']")
for element in elements:
    action_chains.move_to_element(element).perform()
    element.click()

ue = driver.find_elements(By.CSS_SELECTOR, "h4.panel-title4 a[role='button']")

for element in ue:
    action_chains.move_to_element(element).perform()
    element.click()

soup = BeautifulSoup(driver.page_source, "html.parser")
out = {}
tree = soup.find_all(class_="panel panel-info")

for leaf in tree:
    out[leaf.select_one(".panel-title").get_text(strip=True)] = [e.get_text(strip=True) for e in leaf.select("h4.panel-title3 .ml-2")]
    if leaf.find_all("div", class_="panel-warning") != []:
        tutti = leaf.find_all("div", class_="panel-warning")[-1].select("div.panel-primary")
        ok = {}
        for t in tutti:
            ok[t.select_one("h4.panel-title4").get_text(strip=True)]= {e.get_text(strip=True): {} for e in t.select("h4.panel-title5")}

    for k, v in out.items():
        if v == []:
            out[k] = ["Sezione in aggiornamento"]
        elif v[-1] == "Tutti":
            v[v.index("Tutti")] = {"Tutti": ok}

这是我得到的结果示例(导出为json):

{
    "Agricoltura(20)": [
        "CCNL Agricoltura-Aziende in conto terzi del 21-06-2012",
        "CCNL Agricoltura-Operai e Florivivaisti (CGIL,CISL,UIL) del 25-05-2010",
        "CCNL Agricoltura-Operai e Florivivaisti (UGL) del 27-06-2011",
        "CCNL Aziende manutenzione del verde del 25-09-2008",
        {
            "Tutti": {
                "01.\nAgricoltura, silvicoltura e pesca(11)": {
                    "Addetto area della produzione": {},
                    "Addetto conduzione macchine agricole": {},
                    "Addetto conduzione macchine agricole (liv.2°)": {},
                    "Addetto in allevamenti": {},
                    "Addetto in aziende da latte e lattiero casearie": {},
                    "Addetto in aziende orto-floro-frutticole": {}
                },
                "24.\nArea comune(4)": {
                    "Addetto al controllo e gestione dell'attività di impresa": {},
                    "Addetto alle registrazioni ed ai servizi amministrativi": {},
                    "Addetto area contabile, amministrativa": {},
                    "Addetto svolgimento mansioni tecniche amministrative, contabili": {}
                },
                "02.\nProduzioni alimentari(4)": {
                    "Addetto in aziende viti-vinicole": {},
                    "Addetto in impresa multifunzionale": {}
                },
                "14.\nServizi digitali(1)": {
                    "Addetto area informatica": {}
                }
            }
        }
    ],

不打算粘贴它的其余部分,因为它有点大,它显示了这个问题,甚至与这个小位:其中表示例如。“01.\nAgricoltura,silvicoltura e pesca(11)”,括号内的数字是它应该包含的元素数量,但自然它只是跳过名称相同的元素。为了进一步澄清,这是我的输出:

{'Addetto area della produzione': {}, 'Addetto conduzione macchine agricole': {}, 'Addetto conduzione macchine agricole (liv.2°)': {}, 'Addetto in allevamenti': {}, 'Addetto in aziende da latte e lattiero casearie': {}, 'Addetto in aziende orto-floro-frutticole': {}}

这是所需的输出:

{'Addetto area della produzione': {}, 'Addetto conduzione macchine agricole': {}, 'Addetto conduzione macchine agricole': {}, 'Addetto conduzione macchine agricole': {}, 'Addetto conduzione macchine agricole (liv.2°)': {}, 'Addetto in allevamenti': {}, 'Addetto in allevamenti': {}, 'Addetto in aziende da latte e lattiero casearie': {}, 'Addetto in aziende da latte e lattiero casearie': {}, 'Addetto in aziende orto-floro-frutticole': {}, 'Addetto in aziende orto-floro-frutticole': {}}

但当然,我需要有相同名称的项目,以获得自动重命名为其他东西eidogg。

'Addetto conduzione macchine agricole-1': {}, 'Addetto conduzione macchine agricole-2': {}, 'Addetto conduzione macchine agricole-3': {},

有办法做到这一点吗?对不起的长职位,仍然得到了这个窍门(我还需要的链接被刮和内容进入空字典,但嘿,另一天的问题:D)

oxosxuxt

oxosxuxt1#

尝试通过requests_html进行刮取并使用request.html.render(sleep = 3)

相关问题