从userscloud下载文件

时间:2017-07-05 19:04:40

标签: python python-3.x selenium

我正在尝试编写代码,以便我可以从www.userscloud.com网站下载文件(例如此https://userscloud.com/nyp52eufhova)。

此网站有一个下载按钮,必须单击才能显示另一个带有文件“真实”网址的按钮(此网址也会出现在html代码中)。

所以我认为我应该使用Selenium和PhantomJS来模拟点击并编写这段代码:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.PhantomJS()
driver.get("https://userscloud.com/nyp52eufhova")
driver.find_element_by_xpath("//*[@id='btn_download']").click()
print (driver.page_source)

问题是返回的页面源不包含“真实”URL。好像按钮没有被点击一样。

我尝试使用其他元素(如类名和ID)单击按钮但没有成功。我也尝试在获取页面源之前等待driver.implicitly_wait(10),但结果是一样的。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

它不是Selenium解决方案,但您实际上并不需要浏览器来获取文件。你可以使用请求。我把这个小东西扔到了一起。它有两个功能 - 一个用于获取文件名,另一个用于获取文件。

# coding: utf-8
import requests
from bs4 import BeautifulSoup

def get_file_name(url):
    r = requests.get(url)
    soup = BeautifulSoup(r.text, "html.parser")
    file_name = soup.h2.text
    return file_name

def get_zip_from_userscloud(url):
    headers = {
        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding':'gzip, deflate, br',
        'Accept-Language':'da-DK,da;q=0.8,en-US;q=0.6,en;q=0.4',
        'Cache-Control':'max-age=0',
        'Connection':'keep-alive',
        'Content-Type':'application/x-www-form-urlencoded',
        'Host':'userscloud.com',
        'Origin':'https://userscloud.com',
        'Referer':url,
        'Upgrade-Insecure-Requests':1,
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
    }

    payload = {
        'op':'download2',
        'id':url.split("/")[-1],
        'referer':url,
        'adblock_detected':0,
        'down_script':1
        }

    r = requests.post(url, data=payload, headers=headers)
    return r.content

url = 'https://userscloud.com/nyp52eufhova'
file_name = get_file_name(url)
content = get_zip_from_userscloud(url)
with open (file_name, 'wb') as f:
    f.write(content)

因此,如果你有一堆来自userscloud的链接,你可以继续进行,你只需将它们放在一个列表中即可:

for url in links_list:
    file_name = get_file_name(url)
    content = get_zip_from_userscloud(url)
    with open (file_name, 'wb') as f:
        f.write(content)

干杯...