如何到达隐藏在验证码背后的mediafire直接链接?

时间:2015-07-24 15:36:28

标签: python download captcha

我写了一个python程序从互联网上下载文件:

 url = "http://download2163.mediafire.com/icum151v51zg/55rll9s5ioshz5n/Alcohol52_FE_2-0-3-6850.exe"
 file_name ='file'
 u = urllib2.urlopen(url)
 f = open(file_name, 'wb')
 buffer = u.read()
 f.write(buffer)
 f.close()

它工作正常。问题是,在这个程序中,用于下载文件的链接不是常数! 我要下载的文件是使用mediafire上传的。 我发现这个页面的链接(http://www.mediafire.com/download/55rll9s5ioshz5n/Alcohol52_FE_2-0-3-6850.exe)是常数,在这个页面中我找到了我在程序中的链接。事实上,点击按钮"下载(6.77 MB)"用鼠标右键选择"获取此链接" ,我获得了我在程序中使用的直接链接:http://download2163.mediafire.com/icum151v51zg/55rll9s5ioshz5n/Alcohol52_FE_2-0-3-6850.exe

但是这第二个直接链接 - 这是我真正需要的直接链接 - 是可变的!

我找到了获取此变量和重要直接链接的方法:使用第一个和costant链接(http://www.mediafire.com/download/55rll9s5ioshz5n/Alcohol52_FE_2-0-3-6850.exe)我下载了HTML页面,在这个HTML文件中我找到了我需要的直接链接!

问题是:有时当我的python程序尝试下载HTML页面时,它会下载包含直接链接的正确页面,但有时它会使用验证码下载错误的页面!因此无法建立直接联系。

我'我正在寻找一种方法来避免这种验证码,并确保我的python程序始终下载带有直接链接的正确HTML页面!

有什么建议吗?

如果没有办法,有谁知道如何获得我想在互联网上传的文件的直接链接以及我想通过我的python程序下载?

1 个答案:

答案 0 :(得分:0)

您需要在页面中查找可用于始终识别链接的内容。例如,下载链接位于具有“download-link”类的div元素中。您可以解析该div的HTML,然后从其子元素中获取链接。还有其他可能性。例如,您可以在感兴趣的URL中查找唯一且常量的内容,并在抓取页面中的所有链接后使用正则表达式来选择它。

我强烈建议您查看BeautifulSoup库,它可以让您轻松解析HTML。

编辑: 好吧,我没有注意到这一点,因为我最初在我的浏览器中查看了该页面,但显然mediafire只在页面加载后用javascript填充下载div,这使得链接更加困难。值得庆幸的是,他们仍然必须包含下载链接,并使用一个丑陋,可怕的小黑客,我们可以抓住它:

首先,您需要此网址的正则表达式:http://daringfireball.net/2010/07/improved_regex_for_matching_urls

然后抓取页面内容并用beautifulsoup解析:

soup = BeautifulSoup(page)
div_tag = soup.find_all(class_="download_link")[0]
script_tag = div_tag("script")[0]
link = re.findall(regex, script_tag.contents[0])[0]

这是我的整个工作代码:

import requests
import re
from bs4 import BeautifulSoup

pre_regex = r"""(?xi)
\b
(                           # Capture 1: entire matched URL
  (?:
    [a-z][\w-]+:                # URL protocol and colon
    (?:
      /{1,3}                        # 1-3 slashes
      |                             #   or
      [a-z0-9%]                     # Single letter or digit or '%'
                                    # (Trying not to match e.g. "URI::Escape")
    )
    |                           #   or
    www\d{0,3}[.]               # "www.", "www1.", "www2." ... "www999."
    |                           #   or
    [a-z0-9.\-]+[.][a-z]{2,4}/  # looks like domain name followed by a slash
  )
  (?:                           # One or more:
    [^\s()<>]+                      # Run of non-space, non-()<>
    |                               #   or
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\)  # balanced parens, up to 2 levels
  )+
  (?:                           # End with:
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\)  # balanced parens, up to 2 levels
    |                                   #   or
    [^\s`!()\[\]{};:'".,<>?]        # not a space or one of these punct chars
  )
)"""
regex = re.compile(pre_regex)

url = "http://www.mediafire.com/download/raju14e8aq6azbo/Getting+Started+with+MediaFire.pdf"
s = requests.session()
result = s.get(url)
soup = BeautifulSoup(result.content)

div_tag = soup.find_all(class_="download_link")[0]
script_tag = div_tag("script")[0]
link = re.findall(regex, script_tag.contents[0])[0][0]

print link