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

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

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

  1. import json
  2. import requests
  3. from bs4 import BeautifulSoup
  4. from selenium import webdriver
  5. from selenium.webdriver.common.by import By
  6. from selenium.webdriver.common.action_chains import ActionChains
  7. from selenium.webdriver.edge.service import Service as EdgeService
  8. from webdriver_manager.microsoft import EdgeChromiumDriverManager
  9. from selenium.webdriver.edge.options import Options
  10. options = Options()
  11. options.add_argument("--start-maximized")
  12. URL = "https://atlantelavoro.inapp.org/atlante_professioni.php"
  13. driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()), options=options)
  14. action_chains = ActionChains(driver)
  15. driver.get(URL)
  16. driver.implicitly_wait(0.5)
  17. elements = driver.find_elements(By.XPATH, "//a[@role='button']")
  18. for element in elements:
  19. action_chains.move_to_element(element).perform()
  20. element.click()
  21. ue = driver.find_elements(By.CSS_SELECTOR, "h4.panel-title4 a[role='button']")
  22. for element in ue:
  23. action_chains.move_to_element(element).perform()
  24. element.click()
  25. soup = BeautifulSoup(driver.page_source, "html.parser")
  26. out = {}
  27. tree = soup.find_all(class_="panel panel-info")
  28. for leaf in tree:
  29. 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")]
  30. if leaf.find_all("div", class_="panel-warning") != []:
  31. tutti = leaf.find_all("div", class_="panel-warning")[-1].select("div.panel-primary")
  32. ok = {}
  33. for t in tutti:
  34. ok[t.select_one("h4.panel-title4").get_text(strip=True)]= {e.get_text(strip=True): {} for e in t.select("h4.panel-title5")}
  35. for k, v in out.items():
  36. if v == []:
  37. out[k] = ["Sezione in aggiornamento"]
  38. elif v[-1] == "Tutti":
  39. v[v.index("Tutti")] = {"Tutti": ok}

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

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

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

  1. {'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': {}}

这是所需的输出:

  1. {'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。

  1. '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)

相关问题