Найти - Пользователи
Полная версия: Парсинг сайта через BeautifulSoup
Начало » Python для новичков » Парсинг сайта через BeautifulSoup
1 2
noob_saibot
aydat
как победить?
1. Поиграться с hammer_mode
2. Обрабатывать исключение.
aydat
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()
noob_saibot
aydat
Желательно перехватывать исключение именно по тайм ауту от граба, а не все.
После отлавливания можно реализовать что-то типа слипа + повторный вызов функции.
 import time
def foo(n):
	try:
		print 1/n
	except ZeroDivisionError:
		print 'Whoops'
		time.sleep(1)
		n += 1
		foo(n)
foo(0)
py.user.next
aydat
может как-то легче можно было сделать?
Давай входной файл с ИННхами и выходной файл с результатами для них. Можно три ИННхи, но чтобы точно было.
И поставь себе третий питон.
aydat
py.user.next
Не долго музыка играла, 380 запрос и 403 ошибка, что делать?
увеличивать таймаут? стоял 3 сек, юзер агент вроде рандомом сам меняется?
aydat
Все отпарсил, поиграв с таймаутами. спасибо.
Тренируюсь сейчас на 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]
KasFun
вот тут похожая тема
анализ файла
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB