2016-09-09 38 views
-2

我用Perl编写的脚本检索公司文件,如8-K和10-K报表的“完整的提交文本文件”。脚本下载意外

即使这些文件是.txt文件,它们实际上是HTML文件。下面是这些特定的文件之一的首部的一个例子:

<SEC-DOCUMENT>0001104659-12-008133.txt : 20120209 
<SEC-HEADER>0001104659-12-008133.hdr.sgml : 20120209 
<ACCEPTANCE-DATETIME>20120209153739 

这个特定的文件位置为:https://www.sec.gov/Archives/edgar/data/1001838/000110465912008133/0001104659-12-008133.txt

正如你所看到的,当你点击该文件,你可以阅读的内容。然而,下载该文件的Perl脚本生成一个文件与看起来像这样的内容:

±šÜÏ|¨^Ÿ¨T¡š¯À½ä¾<™R¶| [T)S,” àë§-F +™•μ~¨ÀáÊ'jv-IE·T¡Š¥E-“RZujKk)š|4¨”Þªkä<·nðü³²¥XjSmYÎõ™?÷UF™S [Ù} HV¢LšDÆ.zjyßýμ“Èo¿øÒ¾²>šoOª+ &ò'äòDì?Sÿyúà¹ÛùDŽ\üŸr¡ZÙÉ”ò​​ðU†+“Š+ä ÂRbZýÎS{™òc'ü”ð<2 @ ~N“Òä'Õr¥”..._§ ö€ÁV6Õín.SOsÙ!|6¿MÁμì\™ - •ŸqýÏ EEA¢上证所/>' - )”zãöŸt¾ÞÊ-SPA“L¢Deòiò9ÇtúNžq~دfÊ1òSèg- 6àÞ™•Hü¹¨[R‰šÕýŒÛSƒ钕欧盟〜U〜î¹¥/EäH~...§%«ALJ%ÒéüμÆ ‘©PU)A8tÚ¡去•U&L·ÿ†‡ß’«@ S-X-w¶bpq§Ég{#A >JœÂÓl'¼ŽH,OÆþéùðû<!1 *†$¾Ÿú.'ÿÿ™¶MÙoÉ|œýô§^²{¼| | D ?}“;Êl~-¿þ~š &Uødz$`¬<μÒÒæ|Öž$äÔ¡×:!ƒj$Ú:7μFèDî'®€è¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ -k7zý'j(»OL &ª-g೺ö> 2C†Ÿ¹Õ[VèVijÇXEkª&•W¨'ÞTZ«¯〜Z£¥uÕÝè-7c|ÞÐêÔƒÖªë- rcضμÚýQC½μb-½¥ö> 0'»U- ŸXzûï>öMÚJ½®μîbö-)VkQO¯ìFμ_6ɹmS1î'VŒüšüŸ!Â|ï¢Îμk¤¿“©ý\ÌÍP·J ^¼êÌ<±!¿u- /'nÌöêÚùf} m¥ mY²>¤4'»V |?|Y5žîñN«HgCö1ç,WmãÑ6öýÆ¢U7/&}¢一个»aöªÿÞ¨Ã=«ý°æ1P^»1O)〜ÕR¶”

我!想知道这是否是由于加密发生在他们的最终。从浏览他们的网站来看,他们似乎并不承认要加密通过网络传输的文件。我个人不认为这是事实,因为我可以在我的浏览器中手动下载文件。

这里是Perl代码,负责下载文件并将其保存到硬盘驱动器的segmenet:

@arraydata = split(/\,/, $datagn[$j]); 
if($arraydata[2] =~ m/8K/ || $arraydata[2] =~ /8\-K/){ 

# Starts crawler, not checking for errors 
my $mech = WWW::Mechanize->new(autocheck => 0); 

# Grabs address 
@arraydatad = split(/\//, $arraydata[4]); 

# Formats output file name 
$filenamea = "Reports\\" . $dirname . "\\" . $cik . "\\" . $arraydatad[3]; 
chomp($filenamea); 

# This is the file from the EDGAR archives 
$filecrawl = "https://www.sec.gov/Archives/" . $arraydata[4]; 

# This crawls the file and saves it to the hard drive 
$mech->get($filecrawl, ':content_file' => $filenamea); 

完整的代码是在这里:http://pastebin.com/QXb1zcdv

没有任何人有一个想法为什么我在使用SEC.gov的Perl脚本进行下载时,会收到一个废话的文件?

+0

可能只是压缩。尝试删除':content_file'并使用'$ response-> decoded_content(charset =>'none')'来获取文件。可能是更好的方法。 – ikegami

+0

你有没有*尝试调试?看着神秘数据的十六进制转储(比可打印视图更有用)?用Wireshark检查客户端和服务器之间交换的头文件? –

回答

2

:content_file将转储原始内容的具体文件。 如果您执行print $ua->res->headers->as_string以获取响应的HTTP标头,您将看到一个Content-Encoding: gzip标头。这意味着内容是用gzip压缩的。您保存的文件上的快速gzip -dc将为您提供解压缩的文件。

由于池上注释中,你应该使用decoded_content而不是访问数据。顾名思义,这不会给你的原始内容,但将采用必要的解码,在这种情况下,解压缩:

my $ua = WWW::Mechanize->new(); 
$ua->get('https://www.sec.gov/Archives/edgar/data/1001838/000110465912008133/0001104659-12-008133.txt'); 
print $ua->res->decoded_content;