Выполнить парсинг двух страниц с сайта https://zakupki.gov.ru/ по каждой закупке
спарсить номер закупки, дату размещения, обновления и окончание подачи заявок,
начальную цену контракта. Данные сохранить в pandas датафрейм и в формат csv.
pip install requests
pip install beautifulsoup4
pip install pandas
Импортируем необходимые библиотеки:
python
import requests
from bs4 import BeautifulSoup
import pandas as pd
import csv
Теперь создадим функцию для парсинга данных по каждой закупке на странице:
python
def parse_purchase(purchase_url):
response = requests.get(purchase_url)
soup = BeautifulSoup(response.text, 'html.parser')
# Находим и извлекаем необходимые данные из HTML-кода страницы
purchase_number = soup.find('div', {'class': 'row no-gutters'}).find('td').text
purchase_date = soup.find('div', {'class': 'col-6 col-lg-4 purchase-section__left-block'})
.find('table').find_all('td')[1].text
update_date = soup.find('div', {'class': 'col-6 col-lg-4 purchase-section__left-block'})
.find('table').find_all('td')[3].text
end_date = soup.find('div', {'class': 'col-6 col-lg-4 purchase-section__left-block'})
.find('table').find_all('td')[5].text
initial_price = soup.find('div', {'class': 'col-6 purchase__block'})
.find('span', {'class': 'col-lg-6 text-break'}).text
return {
'purchase_number': purchase_number,
'purchase_date': purchase_date,
'update_date': update_date,
'end_date': end_date,
'initial_price': initial_price
}
Теперь напишем функцию для парсинга всех закупок на одной странице:
python
def parse_page(page_url):
response = requests.get(page_url)
soup = BeautifulSoup(response.text, 'html.parser')
purchases = soup.find_all('div', {'class': 'section'})
parsed_data = []
for purchase in purchases:
purchase_url = 'https://zakupki.gov.ru' + purchase.find('a')['href']
parsed_data.append(parse_purchase(purchase_url))
return parsed_data
Напишем основную функцию, которая будет парсить две указанные страницы и сохранять данные в CSV-файл:
python
def parse_and_save_data():
urls = [
'https://zakupki.gov.ru/epz/order/extendedsearch/results.html?morphology=on&search-filter-orderDateFrom=21.04.2017&search-filter-orderDateTo=21.04.2019&pageNumber=1&sortDirection=false&recordsPerPage=_10&showLotsInfoHidden=false&sortBy=UPDATE_DATE&fz223=on&fz44=on&orderDateFrom=21.04.2017&orderDateTo=21.04.2019&updateDateFrom=&updateDateTo=&endDateFrom=&endDateTo=&priceFromGeneral=&priceToGeneral=&priceFromX=',
'https://zakupki.gov.ru/epz/order/extendedsearch/results.html?morphology=on&search-filter-orderDateFrom=21.04.2017&search-filter-orderDateTo=21.04.2019&pageNumber=2&sortDirection=false&recordsPerPage=_10&showLotsInfoHidden=false&sortBy=UPDATE_DATE&fz223=on&fz44=on&orderDateFrom=21.04.2017&orderDateTo=21.04.2019&updateDateFrom=&updateDateTo=&endDateFrom=&endDateTo=&priceFromGeneral=&priceToGeneral=&priceFromX='
]
all_parsed_data = []
for url in urls:
all_parsed_data.extend(parse_page(url))
df = pd.DataFrame(all_parsed_data)
df.to_csv('parsed_data.csv', index=False)
Наконец, вызовем функцию `parse_and_save_data()` для выполнения парсинга и сохранения данных в CSV-файл:
python
if __name__ == '__main__':
parse_and_save_data()
После выполнения кода будет создан CSV-файл `parsed_data.csv`, в котором будут содержаться данные о закупках с указанных страниц. Каждая строка файла соответствует одной закупке, а столбцы содержат информацию о номере закупки, дате размещения, обновления и окончания подачи заявок, начальной цене контракта.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет