Skip to content

Instantly share code, notes, and snippets.

@ansakoy
Created December 16, 2015 05:33
Show Gist options
  • Save ansakoy/d1f86cde686e3db61e70 to your computer and use it in GitHub Desktop.
Save ansakoy/d1f86cde686e3db61e70 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
import requests
import csv
import time
def extract_values(target_api, lst, target_code):
raw = requests.get(target_api)
try:
data = raw.json()
num_contracts = data[u'contracts'][u'total'] # общее число контрактов
num_pages = num_contracts // 50 + (num_contracts % 50 != 0) # число страниц с контрактами
for page in xrange(1, num_pages + 1):
page_url = '{}&page={}'.format(target_api, page)
data = requests.get(page_url).json()
length = len(data[u'contracts'][u'data']) # число контрактов на странице
for index in xrange(length): # перебираем контракты
contract = data[u'contracts'][u'data'][index]
products = contract[u'products']
for product in products: # перебираем продукты
okpd = product.get(u'OKPD') # если ОКПД отсутствует, значение None
okdp = product.get(u'OKDP') # если ОКДП отсутствует, значение None
prod_code = 0
if okdp is not None:
prod_code = okdp.get(u'code') # если присутствует, находим код продукта
elif okpd is not None:
prod_code = okpd.get(u'code') # если присутствует, находим код продукта
if prod_code == target_code:
contract_dict = dict()
reg_num = contract.get(u'regNum') # идентификационный номер контракта
contract_dict['product'] = product.get(u'name', u'-').encode('utf-8') # название продукта
contract_dict['okdp_okpd'] = prod_code
contract_dict['reg_num'] = reg_num
contract_dict['sign_date'] = contract.get(u'signDate', u'-') # дата подписания контракта
customer = contract[u'customer']
contract_dict['customer_name'] = customer.get(u'fullName', u'-').encode('utf-8') # наименование заказчика
contract_dict['customer_kpp'] = customer.get(u'kpp', u'0').encode('utf-8') # КПП заказчика
contract_dict['customer_inn'] = customer.get(u'inn',u'0').encode('utf-8') # ИНН поставщика
supplier = contract[u'suppliers'][0]
if len(contract[u'suppliers']) > 1: # на случай, если поставщиков больше одного
print 'multiple suppliers:', contract.get(u'regNum')
contract_dict['supplier_name'] = supplier.get(u'organizationName', u'0').encode('utf-8') # наименование поставщика
contract_dict['supplier_kpp'] = supplier.get(u'kpp', u'0') # КПП поставщика
contract_dict['supplier_inn'] = supplier.get(u'inn', u'0') # ИНН поставщика
contract_dict['region'] = contract.get(u'regionCode') # регион заказчика
contract_dict['price'] = float(product.get(u'sum', 0)) # общая цена
contract_dict['link'] = 'http://clearspending.ru/contract/{}'.format(reg_num) # URL контракта
lst.append(contract_dict)
except Exception as er:
print er
csv_keys = ['reg_num', 'sign_date', 'region', 'customer_name', 'customer_kpp',
'customer_inn', 'supplier_name', 'supplier_kpp', 'supplier_inn',
'okdp_okpd', 'product', 'price', 'link']
okdp_okpd = [u'15.41.13.120', u'15.41.13.121', u'15.41.13.122', u'15.41.13.123',
u'15.41.13.124', u'15.42.12.110', u'15.42.12.111', u'15.42.12.112', u'15.42.12.113', u'15.42.12.114', u'1514138']
start = time.time()
data_list = list()
for code in okdp_okpd:
print code
api = 'http://openapi.clearspending.ru/restapi/v3/contracts/search/?daterange=01.01.2013-31.12.2015&okdp_okpd={}'.format(code)
print api
try:
extract_values(api, data_list, code)
except Exception as error:
print error
# запись в файл CSV
with open('palm_code.csv', 'wb') as f:
writer = csv.DictWriter(f, fieldnames=csv_keys)
writer.writeheader()
for item in data_list:
writer.writerow(item)
stop = time.time()
print 'Working time:', stop - start
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment