Безгласный интернет-браузер?

Я хотел бы сделать следующее. Войдите в веб-сайт, нажмите пару конкретных ссылок, затем нажмите ссылку для загрузки. Я хотел бы запустить это как запланированную задачу в Windows или cron job в Linux. Я не придирчивый к используемому вами языку, но я бы хотел, чтобы это запускалось без добавления окна браузера на экран, если это возможно.

Ответ 1

Вот список безгласных браузеров, о которых я знаю:

  • HtmlUnit - Java. Пользовательский движок браузера. Ограниченная поддержка JavaScript/DOM эмулируется. Открытый исходный код.
  • Ghost - только Python. WebKit основе. Полная поддержка JavaScript. Открытый исходный код.
  • Twill - Python/командная строка. Пользовательский движок браузера. Нет JavaScript. Открытый исходный код.
  • PhantomJS - Командная строка/все платформы. WebKit основе. Полная поддержка JavaScript. Открытый исходный код.
  • Awesomium - С++/. NET/все платформы. Хром основе. Полная поддержка JavaScript. Коммерческая/бесплатно.
  • SimpleBrowser -.NET 4/С#. Пользовательский движок браузера. Нет поддержки JavaScript. Открытый исходный код.
  • ZombieJS - Node.js. Пользовательский движок браузера. Поддержка JavaScript/эмуляция DOM. Открытый исходный код. На основе jsdom.
  • EnvJS - JavaScript через Java/Rhino. Пользовательский движок браузера. Поддержка JavaScript/эмуляция DOM. Открытый исходный код.
  • Watir-webdriver с безголовый камень - Ruby через WebDriver. Полная поддержка JS через браузеры (Firefox/Chrome/Safari/IE).
  • Spynner - только Python. PyQT и WebKit.
  • jsdom - Node.js. Пользовательский движок браузера. Поддерживает JS через эмулируемый DOM. Открытый исходный код.
  • TrifleJS - порт PhantomJS с использованием MSIE (Trident) и V8. Открытый исходный код.
  • ui4j - чистое решение Java 8. Библиотека обертки вокруг JavaFx WebKit Engine, вкл. безголовых режимов.
  • Chromium Embedded Framework - Полная обновленная встроенная версия Chromium с рендерингом вне экрана по мере необходимости. C/С++, с оболочками .NET(и другими языками). Поскольку это Chromium, он поддерживает все. Лицензия BSD.
  • Selenium WebDriver - Полная поддержка JavaScript через браузеры (Firefox, IE, Chrome, Safari, Opera). Официально поддерживаемые привязки - это С#, Java, JavaScript, Haskell, Perl, Ruby, PHP, Python, Objective-C и R. Неофициальные привязки доступны для Qt и Go. Открытый исходный код.

Безглавые браузеры, поддерживающие поддержку JavaScript через эмулированный DOM, обычно имеют проблемы с некоторыми сайтами, использующими более продвинутые/неясные функции браузера или имеющие функциональные возможности, которые имеют визуальные зависимости (например, через позиции CSS и т.д.), поэтому, хотя чистый JavaScript поддержка в этих браузерах, как правило, завершена, фактическая поддерживаемая функциональность браузера должна рассматриваться только как частичная.

(Примечание: оригинальная версия этого сообщения упоминается только в HtmlUnit, поэтому комментарии. Если вы знаете другие версии браузера без браузера и имеете права на редактирование, не стесняйтесь редактировать эту запись и добавлять их.)

Ответ 2

Посмотрите twill, очень удобный язык сценариев для именно того, что вы ищете. Из examples:

setlocal username <your username>
setlocal password <your password>

go http://www.slashdot.org/
formvalue 1 unickname $username
formvalue 1 upasswd $password
submit

code 200     # make sure form submission is correct!

Там также Python API, если вы ищете большую гибкость.

Ответ 3

Посмотрите PhantomJS, инфраструктура автоматизации на основе JavaScript, доступная для Windows, Mac OS X, Linux, другие * ix-системы.

Используя PhantomJS, вы можете делать такие вещи:

console.log('Loading a web page');

var page = new WebPage();
var url = "http://www.phantomjs.org/";

page.open(url, function (status) {
    // perform your task once the page is ready ...
    phantom.exit();
});

Или оцените заголовок :

var page = require('webpage').create();
page.open(url, function (status) {
    var title = page.evaluate(function () {
        return document.title;
    });
    console.log('Page title is ' + title);
});

Примеры из страницы быстрого запуска PhantomJS. Вы даже можете отобразить страницу в PNG, JPEG или PDF с помощью метода render().

Ответ 4

Я сделал это с помощью элемента управления ActiveX Internet Explorer (WebBrowser, MSHTML). Вы можете создать экземпляр, не делая его видимым.

Это можно сделать на любом языке, который поддерживает COM (Delphi, VB6, VB.net, С#, С++,...)

Конечно, это быстрое и грязное решение и, возможно, не подходит в вашей ситуации.

Ответ 5

PhantomJS - это браузер без браузера, основанный на WebKit, который вы можете script с JavaScript.

Ответ 6

За исключением автоматической загрузки файла (так как это диалоговое окно) эта форма выигрыша со встроенным webcontrol сделает это.

Вы можете посмотреть Watin и Watin Recorder. Они могут помочь с кодом С#, который может войти на ваш сайт, перейти к URL-адресу и, возможно, даже помочь автоматизировать загрузку файла.

YMMV, хотя.

Ответ 7

Если ссылки известны (например, вам не нужно искать на них страницу), то вы, вероятно, можете использовать wget. Я считаю, что он будет выполнять управление состоянием из нескольких наборов.

Если вы немного более предприимчивы, я бы углубился в новые лакомства в Python 3.0. Они перенаправляют интерфейс на свой HTTP-стек и IMHO имеют очень приятный интерфейс, который восприимчив к этому типу сценариев.

Ответ 8

Node.js с YUI на сервере. Посмотрите это видео: http://www.yuiblog.com/blog/2010/09/29/video-glass-node/

Парень в этом видео Dav Glass показывает пример того, как он использует node для извлечения страницы из Digg. Затем он привязал YUI к DOM, который он схватил, и может полностью манипулировать им.

Ответ 10

Вы можете использовать Watir с Ruby или Watin с моно.

Ответ 11

Также вы можете использовать Live Http Headers (расширение Firefox) для записи заголовков, которые отправляются на сайт (Login → Links → Download Link), а затем реплицировать их с помощью php с помощью fsockopen. Единственное, что вам, вероятно, потребуется изменить, - это значение cookie, которое вы получаете на странице входа.

Ответ 12

libCURL можно использовать для создания чего-то вроде этого.

Ответ 13

Можете ли вы не просто использовать диспетчер загрузки?

Там лучше, но FlashGet имеет интеграцию с браузером и поддерживает аутентификацию. Вы можете войти в систему, щелкнуть кучу ссылок и поставить их в очередь и запланировать загрузку.

Вы могли бы написать что-то, что, скажем, действует как прокси-сервер, который улавливает определенные ссылки и ставит их в очередь для последующей загрузки, или букмарклет Javascript, который изменяет ссылки, чтобы перейти на "http://localhost:1234/download_queuer?url=" + $link.href и иметь эту очередь для загрузки, но вы бы переосмыслить колесо менеджера загрузки, а с помощью аутентификации это может быть более сложным.

Или, если вы хотите, чтобы бит "login, click links" также был автоматизирован, просмотрите screen-scraping. В основном вы загружаете страницу через HTTP библиотеки, найти ссылки для скачивания и скачать их.

Немного упрощенный пример, используя Python:

import urllib
from BeautifulSoup import BeautifulSoup
src = urllib.urlopen("http://%s:%[email protected]" % ("username", "password"))
soup = BeautifulSoup(src)

for link_tag in soup.findAll("a"):
    link = link_tag["href"]
    filename = link.split("/")[-1] # get everything after last /
    urllib.urlretrieve(link, filename)

Это будет загружать каждую ссылку на example.com после аутентификации с именем пользователя/паролем "имя пользователя" и "пароль". Вы могли бы, конечно, найти более конкретные ссылки, используя селектор HTML BeautifulSoup (например, вы могли бы найти все ссылки с классом "скачать", или URL, начинающийся с http://cdn.example.com).

Вы можете сделать то же самое на любом языке..

Ответ 14

.NET содержит System.Windows.Forms.WebBrowser. Вы можете создать экземпляр этого, отправить его URL-адресу, а затем легко разобрать html на этой странице. Затем вы можете следовать любым ссылкам, которые вы нашли, и т.д.

Я работал с этим объектом только минимально, поэтому я не эксперт, но если вы уже знакомы с .NET, то, вероятно, стоит посмотреть.