我用美丽的汤和 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)
1条答案
按热度按时间oxosxuxt1#
尝试通过
requests_html
进行刮取并使用request.html.render(sleep = 3)