Как вы экран скрести? [закрыто]

В дополнение к большим ответам до сих пор я хотел бы представить совершенно другую причину, по которой функции стрелок в определенном смысле существенно лучше, чем «обычные» функции JavaScript. Для обсуждения, давайте временно предположим, что мы используем проверку типа TypeScript или «Flow» Facebook. Рассмотрим следующий игрушечный модуль, который является действительным кодом ECMAScript 6 плюс плюс аннотации типа потока: (я буду включать нетипный код, который в конечном итоге будет получен из Babel в конце этого ответа, поэтому он может быть запущен.)

export class C {
  n : number;
  f1: number => number; 
  f2: number => number;

  constructor(){
    this.n = 42;
    this.f1 = (x:number) => x + this.n;
    this.f2 = function (x:number) { return  x + this.n;};
  }
}

Теперь посмотрим, что произойдет, когда мы используем класс C из другого модуля, например:

let o = { f1: new C().f1, f2: new C().f2, n: "foo" };
let n1: number = o.f1(1); // n1 = 43
console.log(n1 === 43); // true
let n2: number = o.f2(1); // n2 = "1foo"
console.log(n2 === "1foo"); // true, not a string!

Как вы можете видеть, ошибка проверки типа здесь: f2 должен был возвратить число, но он вернул строку!

Хуже того, кажется, что нет мыслимой проверки типа может обрабатывать обычные (не стрелочные) функции JavaScript, потому что «это» из f2 не встречается в списке аргументов f2, поэтому требуется type для «this» не может быть добавлен как аннотация к f2.

Эта проблема также затрагивает людей, которые не используют контролеры типов? Я так думаю, потому что даже когда у нас нет статических типов, мы думаем, что они там. («Первые параметры должны быть числом, второе - строкой» и т. Д.). Скрытое «это» действие, которое может или не может быть использовано в теле функции, делает нашу умственную бухгалтерию более сложной.

Вот текущая нетипизированная версия, которая будет вызываться Babel:

class C {
    constructor() {
        this.n = 42;
        this.f1 = x => x + this.n;
        this.f2 = function (x) { return x + this.n; };
    }
}

let o = { f1: new C().f1, f2: new C().f2, n: "foo" };
let n1 = o.f1(1); // n1 = 43
console.log(n1 === 43); // true
let n2 = o.f2(1); // n2 = "1foo"
console.log(n2 === "1foo"); // true, not a string!

13
задан Seth Petry-Johnson 11 March 2010 в 23:16
поделиться

4 ответа

Ответы Мэтта и Пола верны. "Скрейпинг экрана" путем разбора HTML с веб-сайта обычно является плохой идеей, потому что:

  1. Разбор HTML может быть трудным, особенно если он неправильно сформирован. Если вы анализируете очень, очень простую страницу, то регулярные выражения могут сработать. В противном случае используйте фреймворк для парсинга, например HTML Agility Pack.

  2. Веб-сайты - это движущаяся мишень. Вам придется обновлять свой код каждый раз, когда сайт-источник меняет свою структуру разметки.

  3. Скрейпинг экрана не очень хорошо работает с Javascript. Если целевой сайт использует какой-либо динамический сценарий для манипулирования веб-страницей, вам будет очень трудно соскрести его. Легко перехватить HTTP-ответ, гораздо труднее перехватить то, что браузер отображает в ответ на сценарий на стороне клиента, содержащийся в этом ответе.

Если скраппинг экрана - единственный вариант, вот несколько ключей к успеху:

  1. Сделайте так, чтобы было как можно проще менять шаблоны, которые вы ищете. Если возможно, храните шаблоны в виде текстовых файлов или в файле ресурсов. Сделайте так, чтобы другим разработчикам (или вам самим через 3 месяца) было очень легко понять, какую разметку вы ожидаете найти.

  2. Проверяйте вводимые данные и бросайте осмысленные исключения. В коде парсинга позаботьтесь о том, чтобы ваши исключения были очень полезными. Целевой сайт изменится, и когда это произойдет, вы захотите, чтобы ваши сообщения об ошибках говорили вам не только о том, какая часть кода не сработала, но и почему она сработала. Упоминайте и образец, который вы ищете, и текст, с которым вы сравниваете.

  3. Пишите много автоматизированных тестов. Вы хотите, чтобы ваш скрепер было очень легко запустить неразрушающим способом, потому что вы будете делать много итеративных разработок, чтобы получить правильные шаблоны. Автоматизируйте как можно больше тестирования, это окупится в долгосрочной перспективе.

  4. Рассмотрите инструмент автоматизации браузера, например Watin. Если вам требуется сложное взаимодействие с целевым сайтом, может быть проще написать свой скрапер с точки зрения самого браузера, а не возиться с HTTP-запросами и ответами вручную.

Что касается того, как делать скрейп на C#, вы можете либо использовать Watin (см. выше) и скрейпить полученный документ, используя его DOM, либо использовать класс WebClient [см. MSDN или Google], чтобы получить необработанный HTTP-ответ, включая HTML-содержимое, а затем использовать какой-либо текстовый анализ для извлечения нужных вам данных.

12
ответ дан 1 December 2019 в 20:00
поделиться

Используйте Html Agility Pack. Он плохо обрабатывает и неправильно сформированный HTML. Он позволяет выполнять запросы с помощью XPath, что упрощает поиск данных, которые вы ищете. НЕ пишите парсер вручную и НЕ используйте регулярные выражения, это просто слишком неуклюже.

12
ответ дан 1 December 2019 в 20:00
поделиться

Термин, который вы ищете, на самом деле называется Очистка экрана.

При парсинге веб-сайтов вы должны учитывать то, что они находятся вне вашего контроля и могут часто и значительно меняться. Если вы все же откажетесь от соскоба, факт изменения должен стать частью вашей общей стратегии. Например. вам нужно будет обновить свой код рано или поздно, чтобы иметь дело с «движущейся целью».

Вот пара ссылок C # для начала:

http://www.cambiaresearch.com/c4/3ee4f5fc -0545-4360-9bc7-5824f840a28c / How-to-scrape-or-download-a-webpage-using-csharp.aspx

3
ответ дан 1 December 2019 в 20:00
поделиться

Стоит отметить одно: несколько человек упомянули о том, что они вытаскивают веб-сайт как XML, а затем используют XPath для итерации по узлам. Вероятно, важно убедиться, что вы работаете с сайтом, разработанным на XHTML, чтобы убедиться, что HTML представляет собой правильно сформированный XML-документ.

1
ответ дан 1 December 2019 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: