Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 28, 2016 10:20:01

aydat
Зарегистрирован: 2016-09-28
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта через BeautifulSoup

Всем привет, понадобилось спарсить инфу с сайта, решил делать на питоне, хотя с ним плотно не знаком

целевой юрл site

и записать в файл

файл в формате:
номер в реестре БГ;Наименование заказчика-бенефициара;дата размещения;сумма

Пример:
Номер БГ

 <a href="/epz/bankguarantee/guaranteeCard/generalInformation.html?guaranteeId=756371" target="_blank">05W1253616473416006402</a>

Как можно спарсить анкор ссылки по маске ="/epz/bankguarantee/guaranteeCard/generalInformation.html?guaranteeId*?

Наименование заказчика-бенефициара

 <dd>
                                    Наименование заказчика-бенефициара:
                                </dd>
                                <dd>
                                    <a href="http://old.zakupki.gov.ru/controls/public/action/organization/view?source=epz&organizationCode=03201000316" onclick="window.open(this.href); return false;" target="_blank"
                                       title="ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ КАЗЕННОЕ УЧРЕЖДЕНИЕ &quot;ПОГРАНИЧНОЕ УПРАВЛЕНИЕ ФЕДЕРАЛЬНОЙ СЛУЖБЫ БЕЗОПАСНОСТИ РОССИЙСКОЙ ФЕДЕРАЦИИ ПО ПРИМОРСКОМУ КРАЮ&quot;">
                                        ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ КАЗЕННОЕ УЧРЕЖДЕНИЕ "ПОГРАНИЧНОЕ УПРАВЛЕНИЕ ФЕДЕРАЛЬНОЙ СЛУЖБЫ БЕЗОПАСНОСТИ РОССИЙСКОЙ ФЕДЕРАЦИИ ПО ПРИМОРСКОМУ КРАЮ"
                                    </a>
                                </dd>

Тут я не пойму как можно однозначно определить
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ КАЗЕННОЕ УЧРЕЖДЕНИЕ “ПОГРАНИЧНОЕ УПРАВЛЕНИЕ ФЕДЕРАЛЬНОЙ СЛУЖБЫ БЕЗОПАСНОСТИ РОССИЙСКОЙ ФЕДЕРАЦИИ ПО ПРИМОРСКОМУ КРАЮ”

дата размещения
Блок с датой
 <td colspan="2" class="publishingTd">
                            <ul class="publishing">
                                <li>Обновлено:</li>
                                <li class="publishingDate">13.09.2016</li>
                                <li>Размещено:</li>
                                <li class="publishingDate">13.09.2016</li>
                            </ul>
                        </td>

Как мне вытащить 13.09.2016?

Сумма находится в блоке

 <td class="amountTenderTd">
                            <p>
                                
                                    
                                        
                                    
                                    
                                    
                                    
                                
                                <a style="text-decoration:none;" href="/epz/bankguarantee/printForm/view.html?printFormId=102343" target="_blank">
                                    <span class="printBtn"></span>
                                </a>
                                <a href="/epz/bankguarantee/signview/list.html?printFormId=102343" class="linkPopUp ezp addBtn"></a>
                                <a href="/epz/bankguarantee/extract/view.html?guaranteeId=72149" target="_blank">
                                    <span class="orderingBtn"></span>
                                </a>
                            </p>
                            <dl>
                                
                                    <dt>
                                        441 000,00
                                    </dt>
                                    <dd>Российский рубль</dd>
                                
                            </dl>

Тут тоже пока нету мыслей, как спарсить ее

Офлайн

#2 Сен. 28, 2016 11:07:05

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Парсинг сайта через BeautifulSoup

 # -*- coding: utf-8 -*-
from grab import Grab
g = Grab()
g.go('http://old.zakupki.gov.ru/epz/bankguarantee/extendedsearch/search.html?sortDirection=false&guaranteeSortType=PUBLISH_DATE_SORT&recordsPerPage=_100&pageNumber=1&searchText=&strictEqual=false&morphology=false&statuses=PUBLISHED&supplies=&publishDateStart=&publishDateEnd=&updateDateStart=&updateDateEnd=&amountMin=&amountMax=&currencyCode=RUB&supplierInn=2721060592&validityStartDateFrom=&validityEndDateTo=&contractNumber=&orderNumber=&searchAttachedFile=false&attachedFileName=&organizationSearchItem.code=&organizationSearchItem.fz94id=&organizationSearchItem.fz223id=&organizationSearchItem.title=&organizationSearchItem.inn=&bankSearchItem.code=&bankSearchItem.fz94id=&bankSearchItem.fz223id=&bankSearchItem.title=&bankSearchItem.inn=')
sp = [
'//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/dl/dt/a', 
'//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/dl/dd[6]/a', 
'//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/ul/li[4]', 
'//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td[3]/dl/dt'
]
result = [[i.text() for i in g.doc.select(sp[j])] for j in range(len(sp))]
for show in zip(*result):
	print ';'.join(show)

 05W1253616473416006402;ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ КАЗЕННОЕ УЧРЕЖДЕНИЕ "ПОГРАНИЧНОЕ УПРАВЛЕНИЕ ФЕДЕРАЛЬНОЙ СЛУЖБЫ БЕЗОПАСНОСТИ РОССИЙСКОЙ ФЕДЕРАЦИИ ПО ПРИМОРСКОМУ КРАЮ";13.09.2016;515 700,00

Отредактировано noob_saibot (Сен. 28, 2016 11:08:08)

Офлайн

#3 Сен. 28, 2016 11:23:38

aydat
Зарегистрирован: 2016-09-28
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта через BeautifulSoup

Пытаюсь разобрать в вашем коде, а как это сделать в цикле и парсить все сделки на странице? инн будут подгружаться из файла

Отредактировано aydat (Сен. 28, 2016 11:28:39)

Офлайн

#4 Сен. 28, 2016 11:24:49

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Парсинг сайта через BeautifulSoup

aydat
Пытаюсь разобрать в вашем коде, а как это сделать в цикле? для всех сделок на странице?
Скрипт выдаст все, я не весь вывод вставил.

Офлайн

#5 Сен. 28, 2016 11:32:10

aydat
Зарегистрирован: 2016-09-28
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта через BeautifulSoup

noob_saibot
а можно показать, как сделать цикл парсинга по количеству инн в файле innlist.txt
2721060592
7723644828
Инн в юрл supplierInn=2721060592
и сохранение результата в .txt

Отредактировано aydat (Сен. 28, 2016 11:33:03)

Офлайн

#6 Сен. 28, 2016 11:57:32

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Парсинг сайта через BeautifulSoup

aydat
по количеству инн в файле
1. Вообще не понял, что вы хотите.
2. Остальные свистелки/перделки пробуйте сами накрутить. Не получится, поможем.

Отредактировано noob_saibot (Сен. 28, 2016 11:57:53)

Офлайн

#7 Сен. 28, 2016 14:27:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Парсинг сайта через BeautifulSoup

aydat
а можно показать, как сделать цикл парсинга по количеству инн в файле innlist.txt
Вот так это должно выглядеть
  
def make_url(inn):
    out = 'tram pam pam {}'.format(inn)
    return out
 
def load_page(url):
    data = urlopen(url)
    out = data.read()
    return out
 
def make_tree(page):
    out = lxml.html.fromstring(page)
    return out
 
def get_records(tree):
    out = tree.findall('Box')
    return out
 
def parse_record(root):
    a = root[0].text
    b = root[1].text
    c = root[2].text
    out = [a, b, c]
    return out
 
def process_inn(inn):
    out = []
    url = make_url(inn)
    text = load_page(url)
    tree = make_tree(text)
    nodes = get_records(tree)
    for i in nodes:
        out.append(parse_record(i))
    return out
 
def get_inn_numbers(fname):
    with open(fname, encoding='utf-8') as fin:
        return fin.read().splitlines()
 
def load_all_inns(inns):
    out = []
    for i in inns:
        out.append(process_inn(i))
    return out
 
def save_to_file(fname, lst):
    with open(fname, 'w', encoding='utf-8') as fout:
        for i in lst:
            print(';'.join(i), file=fout)
        
def main():
    inns = get_inn_numbers('input.txt')
    loaded_inns = load_all_inns(inns)
    save_to_file('output.txt', loaded_inns)



Отредактировано py.user.next (Сен. 28, 2016 14:38:23)

Офлайн

#8 Сен. 29, 2016 10:57:28

aydat
Зарегистрирован: 2016-09-28
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта через BeautifulSoup

Друзья, при выводи результата кириллица, ошибка:

 Traceback (most recent call last):[Decode error - output not utf-8]
sublime text 2
Нужно в билде системы что-то прописать?
Прописал
 "cmd": ["C:\\Python27\\python.exe", "-u", "$file"],
	"env": {"PYTHONPATH":"C:\\Projects"},
	"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
	"selector": "source.python",
	"encoding": "cp1251"

Вроде ушло, но проблема у меня еще в грабе, win 7 32, пито 2.7.5
При установки:
 Building lxml version 3.6.4.
Building without Cython.
ERROR: "xslt-config" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Пробовал ставить 64 битную,
 from lxml.etree import ParserError
ImportError: DLL load failed: %1 не является приложением Win32.

как можно решить?

up. ошибки все устранил, ищу варианты все это запихнуть в цикл
в предложенном варианте я пока не разобрался и подскажите пжл, как дописывать в начало еще инн?

2721060592;0410122200002514005502;комитет государственного заказа Правительства Хабаровского края;04.08.2014;441 000,00

 # -*- coding: utf-8 -*-
from grab import Grab
inn=2721060592
#inn=7723644828
g = Grab()
g.go('http://old.zakupki.gov.ru/epz/bankguarantee/extendedsearch/search.html?sortDirection=false&guaranteeSortType=PUBLISH_DATE_SORT&recordsPerPage=_100&pageNumber=1&searchText=&strictEqual=false&morphology=false&statuses=PUBLISHED&supplies=&publishDateStart=&publishDateEnd=&updateDateStart=&updateDateEnd=&amountMin=&amountMax=&currencyCode=RUB&supplierInn='+str(inn)+'&validityStartDateFrom=&validityEndDateTo=&contractNumber=&orderNumber=&searchAttachedFile=false&attachedFileName=&organizationSearchItem.code=&organizationSearchItem.fz94id=&organizationSearchItem.fz223id=&organizationSearchItem.title=&organizationSearchItem.inn=&bankSearchItem.code=&bankSearchItem.fz94id=&bankSearchItem.fz223id=&bankSearchItem.title=&bankSearchItem.inn=')
sp = [
'//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/dl/dt/a', 
'//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/dl/dd[6]/a', 
'//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/ul/li[4]', 
'//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td[3]/dl/dt'
]
result = [[i.text() for i in g.doc.select(sp[j])] for j in range(len(sp))]
for show in zip(*result):
    print ';'.join(show).encode('utf-8')

Отредактировано aydat (Сен. 29, 2016 12:38:54)

Офлайн

#9 Сен. 29, 2016 14:11:46

aydat
Зарегистрирован: 2016-09-28
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта через BeautifulSoup

Почти все получилось, кроме вывода в sp = [
inn и созранения вывода в файл в нормальной кодировки

 for show in zip(*result):
        print>> bgres';'.join(show).encode('utf-8')



 # -*- coding: utf-8 -*-
from grab import Grab
import time
#inn=2721060592
#inn=7723644828
g = Grab()
inn=open('innlist.txt').read().splitlines()
bgres= open('bgresult.txt','w')
for x in range(len(inn)):
    time.sleep(5)
    g.go('http://old.zakupki.gov.ru/epz/bankguarantee/extendedsearch/search.html?sortDirection=false&guaranteeSortType=PUBLISH_DATE_SORT&recordsPerPage=_100&pageNumber=1&searchText=&strictEqual=false&morphology=false&statuses=PUBLISHED&supplies=&publishDateStart=&publishDateEnd=&updateDateStart=&updateDateEnd=&amountMin=&amountMax=&currencyCode=RUB&supplierInn='+inn[x]+'&validityStartDateFrom=&validityEndDateTo=&contractNumber=&orderNumber=&searchAttachedFile=false&attachedFileName=&organizationSearchItem.code=&organizationSearchItem.fz94id=&organizationSearchItem.fz223id=&organizationSearchItem.title=&organizationSearchItem.inn=&bankSearchItem.code=&bankSearchItem.fz94id=&bankSearchItem.fz223id=&bankSearchItem.title=&bankSearchItem.inn=')
    sp = [
    '//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/dl/dt/a', 
    '//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/dl/dd[6]/a', 
    '//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/ul/li[4]', 
    '//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td[3]/dl/dt'
    ]
    result = [[i.text() for i in g.doc.select(sp[j])] for j in range(len(sp))]
    for show in zip(*result):
        print>> bgres';'.join(show).encode('utf-8')
bgres.close()

Отредактировано aydat (Сен. 29, 2016 14:16:37)

Офлайн

#10 Сен. 30, 2016 08:47:47

aydat
Зарегистрирован: 2016-09-28
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта через BeautifulSoup

Решил свои хотелки пока так:

  # -*- coding: utf-8 -*-
from grab import Grab
import time
#inn=2721060592
#inn=7723644828
g = Grab()
inn=open('innlist.txt').read().splitlines()
bgres= open('bgresult.txt','w')
for x in range(len(inn)):
    time.sleep(3)
    g.go('http://old.zakupki.gov.ru/epz/bankguarantee/extendedsearch/search.html?sortDirection=false&guaranteeSortType=PUBLISH_DATE_SORT&recordsPerPage=_100&pageNumber=1&searchText=&strictEqual=false&morphology=false&statuses=PUBLISHED&supplies=&publishDateStart=&publishDateEnd=&updateDateStart=&updateDateEnd=&amountMin=&amountMax=&currencyCode=RUB&supplierInn='+inn[x]+'&validityStartDateFrom=&validityEndDateTo=&contractNumber=&orderNumber=&searchAttachedFile=false&attachedFileName=&organizationSearchItem.code=&organizationSearchItem.fz94id=&organizationSearchItem.fz223id=&organizationSearchItem.title=&organizationSearchItem.inn=&bankSearchItem.code=&bankSearchItem.fz94id=&bankSearchItem.fz223id=&bankSearchItem.title=&bankSearchItem.inn=')
    sp = [
    '//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/dl/dt/a', 
    '//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/dl/dd[6]/a', 
    '//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td/ul/li[4]', 
    '//*[@id="exceedSphinxPageSizeDiv"]/div/table/tbody/tr/td[3]/dl/dt'
    ]
    result = [[i.text() for i in g.doc.select(sp[j])] for j in range(len(sp))]
    for show in zip(*result):
        print>>bgres,str(inn[x])+';'+';'.join(show).encode('windows 1251')
bgres.close()

Гуру, жду вашего мнения, может как-то легче можно было сделать?

поставил на ночь парсить и вылетела ошибка
grab.error.GrabTimeoutError: Connection timed out after 3011 milliseconds
как победить?

АП, попробую запустить с опцией:
 g.setup(hammer_mode=True, hammer_timeouts=((3, 5))
Рано радовался, метод больше не поддерживается…

Отредактировано aydat (Сен. 30, 2016 09:20:22)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version