граббер вузы

Discussion in 'PHP' started by rev1zor, 1 Oct 2013.

  1. rev1zor

    rev1zor New Member

    Joined:
    7 Nov 2009
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    кто поможет/подскажет как можно вытянуть данные с сайта http://www.edu-inform.ru/university/ в формате адрес, телефон, почта,сайт
     
  2. wx0

    wx0 New Member

    Joined:
    2 Oct 2013
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    1. цикличный PHP или JS по регулярным выражениям из исходника
    2. цикличный PHP по обрезанию исходника

    JS можно написать в дополнениях и запускать прямо из браузера

    так как элементам теперь чаще дают идентификаторы, то обрезание кода не составляет труда, тут элементы выделены.

    есть и другие варианты, я два наиболее удобных для меня выбрал
     
  3. Artur Fis

    Artur Fis New Member

    Joined:
    22 Sep 2013
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Парсер университетов, вузов

    Там все двумя регулярками делается, ну или через сторонние библиотеки, такие как lxml,xml.


    Code:
    #!/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()
    
    Процесс сбора:

    Code:
    [COLOR=Green]Process =  0 %, count =  0
    Process =  0 %, count =  0
    Process =  0 %, count =  0
    Process =  12 %, count =  30
    Process =  20 %, count =  48
    Process =  27 %, count =  64
    Process =  32 %, count =  77
    Process =  40 %, count =  95
    Process =  40 %, count =  95
    Process =  48 %, count =  114
    Process =  48 %, count =  115
    Process =  62 %, count =  148
    Process =  72 %, count =  171
    Process =  79 %, count =  188
    Process =  100 %, count =  236[/COLOR]
    
    Собранная БД: http://rghost.ru/49129196 [universities.db (42.0 КБ)]

    В БД одна таблица.
    Структура таблицы:

    site, email, telephone, adress

    [​IMG]