На античате, человек обратился с просьбой написать, граббер вузов, с сайта edu-inform.
Да процесс занял несколько минут. Писал с использованием grablib от lorien. Использовал паука, вот весь код:
Да процесс занял несколько минут. Писал с использованием grablib от lorien. Использовал паука, вот весь код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'Artur Fis'
from grab.spider import Spider,Task
from lxml.html import tostring,fromstring
from lxml.html.clean import clean_html
from sqLite import NewSqlEngine
class UniversityGrab(Spider):
initial_urls = ['http://www.edu-inform.ru/university/?PAGEN_1=%s' % str(i) for i in range(1,15)]
results = []
sql = NewSqlEngine('universities.db')
page_number = 0
university_count = 0
def prepare(self):
self.page_count = len(self.initial_urls)
self.sql.create_table('university',{'telephone':'TEXT','address':'TEXT','site':'TEXT','email':'TEXT'})
def print_statistic(self):
process = int((self.university_count*100)/236)
print 'Process = ',process,'%,','count = ',self.university_count
def task_initial(self,grab,task):
for university_url in grab.xpath_list('//a[@class="op_text"]'):
url = grab.make_url_absolute(university_url.get('href'))
yield Task('grab_data',url = url)
self.page_number +=1
self.print_statistic()
def task_grab_data(self,grab,task):
#print grab.response.headers
university = tostring(grab.xpath('//div[@class="card_content"]'))
university_data = fromstring(university).xpath('//p')
push_data = {'telephone':'','address':'','site':'','email':''}
for data in university_data:
text_data = clean_html(data).text_content()
if isinstance(text_data,str):
text = str(text_data)
elif isinstance(text_data,unicode):
text = text_data.encode('windows-1251')
if u'Тел.' in text_data:
push_data['telephone'] = text
elif u'Адрес:' in text_data:
push_data['address'] = text
else:
if ' ' in text_data:
text = text.split(' ')
if '@' in text[0]:
push_data['email'] = text[0]
push_data['site'] = text[1]
elif '@' in text[1]:
push_data['email'] = text[1]
push_data['site'] = text[0]
else:
if '@' in text:
push_data['email'] = text
else:
push_data['site'] = text
self.results.append(push_data)
self.sql.put('university',push_data)
self.university_count += 1
Grabber = UniversityGrab(thread_number=3)
Grabber.run()
Grabber.sql.close()
Grabber.print_statistic()
Комментариев нет:
Отправить комментарий