Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 22, 2017 19:45:05

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Спарсить данные с указанного url

зачем ты три раза открываешь/закрываешь броузер?

 #
from selenium import webdriver
from bs4 import BeautifulSoup as BS
def get_pages(urls):
    driver = webdriver.Firefox(executable_path='/usr/local/bin/geckodriver')
    driver.set_window_size(0,0)
    for url in urls:
        driver.get(url)
        print pars(driver.page_source)
    driver.quit()
    
def pars(html):
    soup = BS(html, 'lxml')
    return soup.find('div', class_='info-date ng-binding ng-scope').text.strip()
if __name__ == '__main__':
    urls = ['http://bus.gov.ru/pub/agency/8968/tasks/3472492',
          'http://bus.gov.ru/pub/agency/8968/plans',
          'http://bus.gov.ru/pub/agency/8968/operations/'
          ]
    get_pages(urls)

Офлайн

#2 Фев. 25, 2017 03:56:56

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 143
Репутация: +  8  -
Профиль   Отправить e-mail  

Спарсить данные с указанного url

vic57
зачем ты три раза открываешь/закрываешь броузер?
а хз, сенькс.

Офлайн

#3 Фев. 25, 2017 07:34:40

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Спарсить данные с указанного url

SlimerJS качает эту страницу без ошибок. Гугл сказал что PhantomJS - движок WebKit (старый), SlimerJS - Gecko

Офлайн

#4 Фев. 25, 2017 17:35:33

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 143
Репутация: +  8  -
Профиль   Отправить e-mail  

Спарсить данные с указанного url

vic57
SlimerJS качает эту страницу без ошибок. Гугл сказал что PhantomJS - движок WebKit (старый), SlimerJS - Gecko
А можно по подробней как ее с питоном подружить. (пример) ?!

Офлайн

#5 Фев. 25, 2017 20:58:43

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Спарсить данные с указанного url

я сохранял контент в файл, как в примере с фантомом выше, а с файлом делай что хочешь. можно через subprocess, или os.system, тока лишний велосипед получается имхо
https://samael500.github.io/articles/python/ralli-na-brauzerakh/

 //get_page.js
var system = require('system');
if (system.args.length < 3 ) {
 console.log('No arguments');
 slimer.exit();
}
else {
 var url = system.args[1];
 var filename = system.args[2];
 var fs = require('fs');
 var page = require('webpage').create();
 page.open(url, function (status) {
   console.log(url,':',status);
//   if (status == 'success') fs.write(filename,page.plainText,'w');
   if (status == 'success') fs.write(filename,page.content,'w');
   slimer.exit();
 });
}
 slimerjs get_page.js 'http://example.com' 'example.html'

Отредактировано vic57 (Фев. 26, 2017 00:05:20)

Офлайн

#6 Фев. 26, 2017 00:25:51

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Спарсить данные с указанного url

с точки зрения безопасности лучше

 //get_page.js
var system = require('system');
if (system.args.length < 2 ) {
 system.stderr.write('No arguments');
 slimer.exit();
}
else {
 var url = system.args[1];
 var page = require('webpage').create();
 page.open(url, function (status) {
   system.stderr.write(url,':',status);
   //if (status == 'success') system.stdout.write(page.plainText);
   if (status == 'success') system.stdout.write(page.content);
   slimer.exit();
 });
}
 slimerjs get_page.js 'http://example.com' > example.html

Отредактировано vic57 (Фев. 26, 2017 00:29:55)

Офлайн

#7 Фев. 26, 2017 09:45:49

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 143
Репутация: +  8  -
Профиль   Отправить e-mail  

Спарсить данные с указанного url

vic57
я сохранял контент в файл, как в примере с фантомом выше, а с файлом делай что хочешь. можно через subprocess, или os.system, тока лишний велосипед получается имхо
https://samael500.github.io/articles/python/ralli-na-brauzerakh/
Спасибо за ссылку.

В общем старый код все - таки заставил нормально отрабатывать добавил в цикле проверку на нормальный ответ. и даже при использовании движка Chrome стал работать быстрей…
 from selenium import webdriver
from bs4 import BeautifulSoup as BS
def get_pages(urls):
    driver = webdriver.Chrome()
    driver.set_window_size(0, 0)
    driver.set_window_position(1000, 0)
    for url in urls:
        driver.get(url)
        while True:
            req = pars(driver.page_source)
            if req != '-':
                break
        print(req)
    driver.quit()
def pars(html):
    soup = BS(html, 'lxml')
    try:
        r = soup.find('div', class_='info-container info-container_np').find('div', class_='info-date ng-binding ng-scope').text.strip()
        return r
    except:
        try:
            r = soup.find('div', class_='info-date').find('span', class_='ng-binding ng-scope').text.strip()
            return r
        except:
            return '-'
if __name__ == '__main__':
    urls = ['http://bus.gov.ru/pub/agency/206030/tasks/3573224',
            'http://bus.gov.ru/pub/agency/206030/plans',
            'http://bus.gov.ru/pub/agency/206030/operations/',
            'http://bus.gov.ru/pub/agency/206030/annual-balances-F0503721',
            'http://bus.gov.ru/pub/agency/206030/annual-balances-F0503730',
            'http://bus.gov.ru/pub/agency/206030/annual-balances-f0503737',
            'http://bus.gov.ru/pub/agency/206030/reports',
            'http://bus.gov.ru/pub/agency/206030/measures'
            ]
    get_pages(urls)

Офлайн

#8 Фев. 26, 2017 14:10:52

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Спарсить данные с указанного url

при использовании движка Chrome стал работать быстрей…
хром просто грузит быстрее фф, тока памяти жрет больше. метод имхо - против лома нет приема
у меня этот код 700 метров озу расходует.
для твоего случая можно проще

 #!/usr/bin/env python
# coding:utf-8
from subprocess import Popen,PIPE
def get_page(url):
    child = Popen(['/usr/local/bin/slimerjs','get_page.js',url],stdout=PIPE)
    child.wait()
    out = child.stdout.read().split('\n')
    for i in out:
        s = i.decode('utf-8')
        if u'Дата публикации' in s:
            print s
            break
if __name__ == '__main__':
    urls = ['http://bus.gov.ru/pub/agency/206030/tasks/3573224',
            'http://bus.gov.ru/pub/agency/206030/plans',
            'http://bus.gov.ru/pub/agency/206030/operations/',
            'http://bus.gov.ru/pub/agency/206030/annual-balances-F0503721',
            'http://bus.gov.ru/pub/agency/206030/annual-balances-F0503730',
            'http://bus.gov.ru/pub/agency/206030/annual-balances-f0503737',
            'http://bus.gov.ru/pub/agency/206030/reports',
            'http://bus.gov.ru/pub/agency/206030/measures'
            ]
    for url in urls: get_page(url)
 //get_page.js
'use strict'
var system = require('system');
if (system.args.length < 2 ) {
 console.log('No arguments');
 slimer.exit();
}
else {
 var url = system.args[1];
 var page = require('webpage').create();
 page.open(url, function (status) {
   if (status == 'success') console.log(page.plainText);
   slimer.exit();
 });
}

Отредактировано vic57 (Фев. 26, 2017 16:28:08)

Офлайн

#9 Фев. 26, 2017 16:44:35

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 143
Репутация: +  8  -
Профиль   Отправить e-mail  

Спарсить данные с указанного url

vic57
хром просто грузит быстрее фф, тока памяти жрет больше. метод имхо - против лома нет приема
у меня этот код 700 метров озу расходует.
Согласен, способ в лоб но эффективный

vic57
для твоего случая можно проще
Ну скажем это был только частный случай…
а вообще сам проект вот Тут.
Да пока так, в сторону оптимизации не смотрел, + вывод данных пока тупо в txt - тоже под вопросом как нужно данные выгружать и тд.

Офлайн

#10 Фев. 26, 2017 16:58:40

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Спарсить данные с указанного url

Vigi
а вообще сам проект вот Тут.
статистика == базы данных
накопление, фильтрация, обработка

Отредактировано vic57 (Фев. 26, 2017 16:59:01)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version