多个wget用命名约定保存多个本地文件

时间:2014-05-14 16:43:44

标签: php xml rss cron wget

摘要
我正在使用PHP新闻爬虫项目,并希望使用wget(版本1.12)从近百个新闻网站中提取RSS新闻源,以捕获整个RSS源文件,所有这些都在本地服务器的一个目录(无层次结构)中关于:

  • 其中一些网站没有RSS提要,因此我应该捕获并解析他们的HTML,但在开始时我只能专注于XML提要。
  • 所有网站在一个目录中的所有Feed文件
  • 不应下载额外内容。所有额外内容(如图像,如果有的话)都应托管在遥控器上。
  • 表现很重要
  • 根据我的惯例source.category.type.xml(每个XML远程网址都有自己的来源,类别和类型,但没有我的命名约定),在保存前需要重命名源文件
  • 其中一些Feed 不包含与<pubDate>一样的新闻时间戳,因此我必须选择一种良好的工作方法来处理新闻时间,即使只是略有差异但又强大,有效,永远有效。
  • 要自动化,我需要定期在此wget上执行cron作业

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:根据this wget instructions

  1. url-list.txt应包含一系列网址,每行一个
  2. 在没有wget-N-nc-r的情况下运行-p时,在同一目录中下载相同的文件将导致原始副本保留FILE,第二个副本名为FILE.1
  3. 使用像-O这样的wget -O FILE 它将整个下载输出到一个文件中。
  4. 使用-N进行时间戳
  5. -w SECONDS将在下次检索前的SECONDS秒内保持
  6. -nd强制wget在递归检索时不要创建目录层次结构。启用此选项后,所有文件都将保存到当前目录,而不会破坏(如果名称显示多次,则文件名将获得扩展名。.n&#39;)
  7. -nH禁用主机前缀目录的生成(默认情况下-r的行为)。
  8. -P PREFIX将目录前缀设置为PREFIX。 &#34;目录前缀&#34;是保存所有其他文件和子目录的目录,即检索树的顶部。
  9. -k转换用于离线浏览的链接

    $ wget -nH -N -i url-list.txt
    
  10. <小时/> 使用(wget&amp; cron job和php)问题

    1. 如何处理新闻时间?最好是在source.category.type.timestamp.xml等文件名中保存时间戳,或使用php 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 read url; do
        wget -nH -N -O nameConvention $url
      done < utl-list.txt
      

1 个答案:

答案 0 :(得分:0)

我建议远离wget完成你的任务,因为它让你的生活无缘无故地复杂化。 PHP可以很好地获取下载。

我会将所有网址添加到数据库中(它可能只是一个文本文件,就像你的情况一样)。然后我会使用cronjob来触发脚本。 在每次运行中,我会检查固定数量的站点并将其RSS源放入该文件夹中。例如。 file_get_contentsfile_put_contents你很高兴。这使您可以完全控制要获取的内容以及如何保存它。

我会使用另一个遍历文件的脚本并进行解析。将脚本从开头分离将有助于您稍后进行扩展。 对于一个简单的站点,只需按mtime对文件进行排序即可。对于大规模的扩展,我会使用一个职业队伍。

PHP的开销很小,而使用wget的额外复杂性是一个很大的负担。