我正在尝试编写代码,以便我可以从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),但结果是一样的。
有什么想法吗?
答案 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)
干杯...