Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 30, 2016 09:06:04

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

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

aydat
как победить?
1. Поиграться с hammer_mode
2. Обрабатывать исключение.

Офлайн

#2 Сен. 30, 2016 09:39:06

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

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

noob_saibot
Попробовал обработать исключение, правильно?
хаммер мод уже не поддерживается
добавил еще
 g.setup(log_file='log.txt')
посмотрим, что выдает нам

 # -*- coding: utf-8 -*-
from grab import Grab
import time
#inn=2721060592
#inn=7723644828
g = Grab()
#g.setup(hammer_mode=True, hammer_timeouts=((1, 1), (2, 2), (30, 30)))
inn=open('innlist.txt').read().splitlines()
bgres= open('bgresult.txt','w')
for x in range(len(inn)):
    try: 
        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 str(inn[x])+';'+';'.join(show).encode('utf-8')
            print>>bgres,str(inn[x])+';'+';'.join(show).encode('windows 1251')
    except Exception: 
        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 str(inn[x])+';'+';'.join(show).encode('utf-8')
            print>>bgres,str(inn[x])+';'+';'.join(show).encode('windows 1251')
bgres.close()

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

Офлайн

#3 Сен. 30, 2016 09:55:24

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

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

aydat
Желательно перехватывать исключение именно по тайм ауту от граба, а не все.
После отлавливания можно реализовать что-то типа слипа + повторный вызов функции.
 import time
def foo(n):
	try:
		print 1/n
	except ZeroDivisionError:
		print 'Whoops'
		time.sleep(1)
		n += 1
		foo(n)
foo(0)

Отредактировано noob_saibot (Сен. 30, 2016 09:55:50)

Офлайн

#4 Сен. 30, 2016 10:19:51

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

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

aydat
может как-то легче можно было сделать?
Давай входной файл с ИННхами и выходной файл с результатами для них. Можно три ИННхи, но чтобы точно было.
И поставь себе третий питон.



Офлайн

#5 Сен. 30, 2016 11:22:23

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

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

py.user.next
Не долго музыка играла, 380 запрос и 403 ошибка, что делать?
увеличивать таймаут? стоял 3 сек, юзер агент вроде рандомом сам меняется?

Офлайн

#6 Окт. 6, 2016 13:58:46

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

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

Все отпарсил, поиграв с таймаутами. спасибо.
Тренируюсь сейчас на https://www.nalog.ru/rn77/taxation/kbk/fl/ndfl/

хочу спарсить
Коды бюджетной классификации;Наименование доходов

Пример
182 1 01 02030 01 1000 110;Налог на доходы физических лиц с доходов, полученных физическими лицами в соответствии со статьей 228 Налогового Кодекса Российской Федерации (сумма платежа (перерасчеты, недоимка и задолженность по соответствующему платежу, в том числе по отмененному)

Как добраться до этих элементов по XPath? пока плохо представляю

 g.go('https://www.nalog.ru/rn77/taxation/kbk/fl/ndfl/')
sp = [
'//*[@id="main"]/div[2]/table/tbody/tr[2]/td[2]/p', 
'//*[@id="main"]/div[2]/table/tbody/tr[2]/td[1]/p/text()'
]
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')

так парсит только первое вхождение

 182 1 01 02030 01 1000 110;Налог на доходы физических лиц с доходов, полученных физическими лицами в соответствии со статьей 228 Налогового Кодекса Российской Федерации (сумма платежа (перерасчеты, недоимка и задолженность по соответствующему платежу, в том числе по отмененному)
[Finished in 0.8s]

Отредактировано aydat (Окт. 6, 2016 14:20:11)

Офлайн

#7 Март 11, 2018 12:52:54

KasFun
Зарегистрирован: 2018-03-10
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

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

вот тут похожая тема
анализ файла

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version