Несколько wget для сохранения нескольких локальных файлов с соглашением об именах

Резюме
Я участвую в проекте поискового робота PHP и хочу извлекать RSS-каналы новостей почти с сотни новостных веб-сайтов с помощью wget (версия 1.12) для захвата всех файлов RSS-каналов в одном каталоге. (без иерархии) на локальном сервере в отношении:

  • Некоторые из этих веб-сайтов не имеют RSS-канала, поэтому мне нужно захватить и проанализировать их HTML, но вначале я могу просто сосредоточиться на XML-каналах.
  • Все файлы каналов со всех сайтов в одном каталоге.
  • Никакой дополнительный контент не скачивается. весь дополнительный контент (например, изображения, если они есть) должен размещаться на пульте дистанционного управления.
  • Производительность важна
  • Файлы каналов необходимо переименовать перед сохранением в соответствии с моим соглашением, например source.category.type.xml (каждый удаленный URL-адрес XML имеет свой собственный источник, категорию и тип, но не в соответствии с моим соглашением об именах)
  • Некоторые из этих каналов не включают метку времени новостей, как в случае с <pubDate>, поэтому я должен выбрать хороший рабочий подход, чтобы обрабатывать время новостей, даже с небольшой разницей, но надежным, работающим и всегда функциональным.
  • Чтобы автоматизировать это, мне нужно регулярно выполнять задание cron на этом wget.

url-list.txt включает:

http://source1/path/to/rss1  
http://source2/diiferent/path/to/rss2  
http://source3/path/to/rss3  
.  
.  
.  
http://source100/different/path/to/rss100

Я хочу этот:

localfeed/source1.category.type.xml  
localfeed/source2.category.type.xml  
localfeed/source3.category.type.xml  
.  
.  
.  
localfeed/source100.category.type.xml

Категория и тип могут иметь несколько предопределенных значений, например sport, ...


Что у меня есть?
На самом первом уровне я должен делать мои wget, используя список удаленных URL: Согласно эти инструкции wget:

  1. url-list.txt должен состоять из серии URL-адресов, по одному в каждой строке.
  2. При запуске wget без -N, -nc, -r или -p загрузка того же файла в том же каталоге приведет к сохранению исходной копии FILE, а второй копии будет присвоено имя FILE.1.
  3. Использование -O, например wget -O FILE, не означает просто «использовать имя ФАЙЛ вместо имени в URL». Он выводит все загрузки только в один файл.
  4. Используйте -N для отметки времени
  5. -w SECONDS будет удерживаться SECONDS секунд до следующего извлечения
  6. -nd заставляет wget не создавать иерархию каталогов при рекурсивном извлечении. Если эта опция включена, все файлы будут сохраняться в текущем каталоге без затирания (если имя отображается более одного раза, имена файлов будут иметь расширение `.n ')
  7. -nH отключает создание каталогов с префиксом хоста (поведение, которое -r по умолчанию).
  8. -P PREFIX устанавливает префикс каталога в PREFIX. «Префикс каталога» - это каталог, в котором будут сохранены все другие файлы и подкаталоги, то есть верхняя часть дерева поиска.
  9. -k преобразует ссылки для просмотра в автономном режиме

    $ wget -nH -N -i url-list.txt
    


Проблемы с (wget & cron job и php):

  1. Как управлять временем новостей? лучше ли сохранять метку времени в именах файлов, таких как source.category.type.timestamp.xml, или получать время изменения, используя функцию phps stat следующим образом:

    $stat = stat('source.category.type.xml');
    $time = $stat('mtime');     //last modification time
    

    или любые другие идеи (которые всегда работают и надежны)

  2. Как обрабатывать имена файлов? Я хочу сохранять файлы локально в соответствии с определенным соглашением (source.category.type.xml), и поэтому я думаю, что wget options, например, --trust-server-names или --content-disposition, не могут помочь. Я думаю, мне следует перейти к следующему циклу while:

    while read url; do
      wget -nH -N -O nameConvention $url
    done < utl-list.txt
    

person Pmpr    schedule 14.05.2014    source источник


Ответы (1)


Я предлагаю держаться подальше от wget для вашей задачи, так как он без причины усложняет вашу жизнь. PHP отлично подходит для получения загрузок.

Я бы добавил все URL-адреса в базу данных (это может быть просто текстовый файл, как в вашем случае). Затем я бы использовал cronjob для запуска скрипта. При каждом запуске я проверял фиксированное количество сайтов и помещал их RSS-каналы в папку. Например. с file_get_contents и file_put_contents все готово. Это позволяет вам полностью контролировать, что нужно получить и как сохранить.

Я бы использовал другой сценарий, который просматривает файлы и выполняет синтаксический анализ. Разделение скриптов с самого начала поможет вам в дальнейшем масштабировании. Для простого сайта простая сортировка файлов по mtime должна помочь. Для большого масштабирования я бы использовал очередь заданий.

Накладные расходы в PHP минимальны, в то время как дополнительная сложность с использованием wget является большим бременем.

person pgampe    schedule 06.06.2014