模拟浏览器下载文件?

it_*_*ure 15 python shell wget mechanize

网络上有一个FLV文件,可以直接在Chrome中下载.该文件是由中央电视台(CCTV)出版的电视节目.中央电视台是一家非盈利的国有广播公司,由中国纳税人提供资金,允许我们在不侵犯版权的情况下下载其内容.

使用wget,我可以从不同的地址下载文件,但不能从Chrome中的地址下载.

这就是我试图做的事情:

url='http://114.80.235.200/f4v/94/163005294.h264_1.f4v?10000&key=7b9b1155dc632cbab92027511adcb300401443020d&playtype=1&tk=163659644989925531390490125&brt=2&bc=0&nt=0&du=1496650&ispid=23&rc=200&inf=1&si=11000&npc=1606&pp=0&ul=2&mt=-1&sid=10000&au=0&pc=0&cip=222.73.44.31&hf=0&id=tudou&itemid=135558267&fi=163005294&sz=59138302'  

wget -c  $url --user-agent="" -O  xfgs.f4v
Run Code Online (Sandbox Code Playgroud)

这也不起作用:

wget -c  $url   -O  xfgs.f4v
Run Code Online (Sandbox Code Playgroud)

输出是:

Connecting to 118.26.57.12:80... connected.  
HTTP request sent, awaiting response... 403 Forbidden  
2013-02-13 09:50:42 ERROR 403: Forbidden.  
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

我最终想用Python库下载它mechanize.这是我正在使用的代码:

import mechanize  
br = mechanize.Browser()  
br = mechanize.Browser()  
br.set_handle_robots(False)  
br.set_handle_equiv(False)   
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]  
url='http://114.80.235.200/f4v/94/163005294.h264_1.f4v?10000&key=7b9b1155dc632cbab92027511adcb300401443020d&playtype=1&tk=163659644989925531390490125&brt=2&bc=0&nt=0&du=1496650&ispid=23&rc=200&inf=1&si=11000&npc=1606&pp=0&ul=2&mt=-1&sid=10000&au=0&pc=0&cip=222.73.44.31&hf=0&id=tudou&itemid=135558267&fi=163005294&sz=59138302' 
r = br.open(url).read()  
tofile=open("/tmp/xfgs.f4v","w")  
tofile.write(r)  
tofile.close()
Run Code Online (Sandbox Code Playgroud)

这是结果:

Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
  File "/usr/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 203, in open  
   return self._mech_open(url, data, timeout=timeout)  
  File "/usr/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 255, in _mech_open  
raise response  
mechanize._response.httperror_seek_wrapper: HTTP Error 403: Forbidden
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释如何使mechanize代码工作吗?

G. *_*rer 22

首先,如果你正在尝试任何类型的抓取(是的,即使你不一定解析HTML也算作抓取),你需要进行一定数量的初步调查.

如果您还没有FirefoxFirebug,请获取它们.然后,如果您还没有Chrome,请获取它.

启动Firefox/Firebug和Chrome,清除所有cookie /等.然后打开Firebug,在Chrome中打开View-> Developer-> Developer Tools.

然后加载您要抓取的视频的主页面.注意页面加载时正在设置的任何cookie/headers/POST变量/查询字符串变量.您可能希望在某处保存此信息.

然后尝试再次下载视频,注意加载视频时正在设置的任何cookie /标题/帖子变量/查询字符串变量.您最初加载页面时很可能设置了cookie或POST变量,这是实际提取视频文件所必需的.

编写python时,您需要尽可能地模拟此交互.使用python-requests.这可能是最简单的URL库中可用,除非你用它碰壁以某种方式(一些它不能做的),我永远不会使用别的.第二个我开始使用python-requests,我的所有URL抓取代码缩小了5倍.

现在,第一次尝试它们时可能无法正常工作.Soooo,你需要使用python加载主页面.打印出所有cookie /标题/ POST变量/查询字符串变量,并将它们与Chrome/Firebug的变量进行比较.然后尝试加载您的视频,再次比较所有这些值(这意味着您发送服务器的内容,以及SERVER发回给您的内容).你需要弄清楚他们之间有什么不同(别担心,我们都在幼儿园学到了这一点......"其中一件事情与另一件事情不同")并剖析这种差异是如何破坏的.

如果在所有这些结束时,您仍然无法弄明白,那么您可能需要查看包含电影链接的页面的HTML.在页面中查找任何javascript.然后使用Firebug/Chrome开发人员工具检查javascript,看看它是否正在对您的用户会话进行某种管理.如果它以某种方式生成与视频访问相关的令牌(cookie或POST/GET变量),则需要在python中模拟其标记化方法.

希望所有这些都有所帮助,并且看起来并不太可怕.关键是你需要成为一名科学家.弄清楚你知道什么,你不知道什么,你想要什么,并开始试验和记录你的结果.最终会出现一种模式.

编辑:澄清步骤

  1. 调查国家的维护方式
  2. 使用python拉出初始页面,从中获取所需的任何状态信息
  3. 执行该状态信息可能需要的任何标记
  4. 使用步骤2和3中的标记拉视频
  5. 如果内容爆炸,请输出您的请求/响应标头,Cookie,查询变量,发布变量,并将它们与Chrome/Firebug进行比较
  6. 返回步骤1.直到找到解决方案

编辑: 您可能也会被重定向到这些请求中的任何一个(html页面或文件下载).如果发生这种情况,您很可能会错过Firebug/Chrome中的请求/响应.解决方案是使用类似LiveHTTPHeaders的嗅探器,或者像其他响应者,WireSharkFiddler所建议的那样.请注意,如果您使用的是Linux或OSX,Fiddler对您没有任何帮助.它只是Windows,并且绝对专注于.NET开发......(嗯).Wireshark非常有用,但对于大多数问题都是过度杀伤,并且根据您运行的机器,您可能会遇到问题.所以我建议先使用LiveHTTPHeaders.

我喜欢这种问题

  • 老实说,我喜欢这样的答案,听起来像是"不给我鱼而是学会钓鱼"的比喻.这些都是很好的提示. (5认同)

Eri*_*ric 5

似乎机械化可以进行状态浏览,这意味着它将在浏览器请求之间保留上下文和cookie.我建议首先加载视频所在的完整页面,然后再尝试明确下载视频.这样,Web服务器就会认为它是一个完整的(合法的)浏览会话


dno*_*zay 5

  1. 您可以在浏览器中使用seleniumwatir执行所需的所有操作.
  2. 因为你不想看到浏览器,你可以运行selenium headless.

也看到这个答案.


Ant*_*hon 5

假设您没有手动输入蓝色的URL,请使用mechanize首先转到您从中获取该URL的页面.然后模拟您下载实际文件的操作(可能单击链接或按钮).

这可能不起作用,因为Mechanize保持cookie和重定向的状态,但不处理对html页面的任何JavaScript实时更改.要检查JavaScript是否对操作至关重要,请在Chrome(或任何其他浏览器)中切换JavaScript,并确保您可以下载该文件.如果需要JavaScript,我会尝试以编程方式驱动浏览器来获取文件.

我尝试这种刮擦的常用方法是

  1. 尝试wget或pythons urllib2
  2. 尝试机械化
  3. 开一个浏览器

除非有一些验证码,否则最后一个通常有效,但其他的更容易(也更快).