el1syum

Untitled

Aug 26th, 2023 (edited)
1,159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.42 KB | None | 0 0
  1. import time
  2. from concurrent.futures import ThreadPoolExecutor
  3.  
  4. import pandas as pd
  5. import requests
  6. from bs4 import BeautifulSoup
  7.  
  8. TABLE_NAME = 'output.xlsx'
  9.  
  10.  
  11. def get_lab_name(link):
  12.     while True:
  13.         try:
  14.             response = requests.get(link)
  15.             soup = BeautifulSoup(response.content, 'html.parser')
  16.             element = soup.find('div', class_='gost-form__label', string='Наименование')
  17.             lab_name = element.find_next_sibling('div').text
  18.             return lab_name
  19.         except requests.RequestException as e:
  20.             print(f"Ошибка при загрузке страницы: {e}")
  21.             time.sleep(1)
  22.         except AttributeError:  # в случае если каким то образом на странице не будет name
  23.             return ''
  24.  
  25.  
  26. url = 'https://www.rst.gov.ru/portal/gost/home/activity/compliance/evaluationcompliance/AcknowledgementCorrespondence/safetycertificate018?portal:componentId=ff119059-8bd4-47fc-95f6-a70de17a4b3e&portal:isSecure=false&portal:portletMode=view&navigationalstate=JBPNS_rO0ABXdgAAhwYWdlU2l6ZQAAAAEAAjIwAAdvcmRlckJ5AAAAAQAYZGF0ZW9maXNzdWVvZmNlcnRpZmljYXRlAARmcm9tAAAAAQABMAAFb3JkZXIAAAABAARERVNDAAdfX0VPRl9f'
  27.  
  28. page_number = 1
  29. max_pages = 2  # сколько страниц парсить
  30.  
  31. data = []
  32.  
  33. while page_number <= max_pages:
  34.     while True:
  35.         try:
  36.             response = requests.get(url)
  37.             soup = BeautifulSoup(response.content, 'html.parser')
  38.             break
  39.         except requests.RequestException as e:
  40.             print(f"Ошибка при загрузке страницы: {e}")
  41.             time.sleep(1)
  42.  
  43.     table = soup.find('table')
  44.  
  45.     with ThreadPoolExecutor(max_workers=5) as executor:  # можно ли макс воркерс поставить 9999 ?????
  46.         for row in table.find_all('tr')[1:]:
  47.             cells = row.find_all('td')
  48.             link = cells[2].find('a')['href']
  49.             lab_name_future = executor.submit(get_lab_name, link)
  50.             column1 = cells[0].text.strip()
  51.             column2 = cells[1].text.strip()
  52.             column3 = cells[2].text.strip()
  53.             column4 = cells[3].text.strip()
  54.             column5 = cells[4].text.strip()
  55.             column6 = cells[5].text.strip()
  56.             lab_name = lab_name_future.result()
  57.             data.append({'Ссылка': link, 'Лаборатория': lab_name, 'Марка': column1, 'Шасси': column2, 'Номер': column3,
  58.                          'Дата': column4, 'Эко класс': column5, 'Примечание': column6})
  59.     next_button = soup.find('a', string='Вперед →')  # Найти ссылку на следующую страницу
  60.     if next_button:
  61.         url = next_button['href']  # обновить юрл для некст страницы
  62.         print(f'спарсил страницу {page_number} из {max_pages}')
  63.         page_number += 1  # счетчик +
  64.     else:
  65.         break  # если ссылка на следующую страницу не найдена, выйти из цикла, но наверное неверно
  66.  
  67. df = pd.DataFrame(
  68.     data)  # мб сделать как то сохранение после перехода к след странице чтобы не сильно грузить озу ну и наверное должно быстрее воркать
  69. df.to_excel(TABLE_NAME, index=False)
  70.  
Advertisement
Add Comment
Please, Sign In to add comment