在Heroku上下载带有硒的文件

时间:2018-12-27 23:54:54

标签: python django selenium heroku web-scraping

我正在尝试从链接下载文件,解析该文件,然后将特定数据保存到我的heroku数据库中。我已经成功设置了selenium chrome网络驱动程序,并且能够登录。通常,当我获得该URL时,它将开始自动下载。我为要保存到heroku上的文件设置了新目录。它似乎不在这里或任何地方。

我尝试了不同的设置下载目录的方法,还尝试了其他登录网站的方法,并在本地进行了功能上的调试,但是在heroku生产中却没有。

# importing libraries
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import datetime
from datetime import timedelta
import os
import json
import csv 

# temporary credentials to later be stored
# as env vars
user = "user"
psw = "pasw"
account = 'account'

# this is the directory to download the file
file_directory = os.path.abspath('files')

# making this directory the default chrome web driver directory
options = webdriver.ChromeOptions()
prefs = {
"download.default_directory": file_directory
        }
options.add_experimental_option('prefs',prefs)
# setting up web driver
driver = webdriver.Chrome(chrome_options=options)

# logging in to pinterest
url_login = 'https://www.pinterest.com/login/?referrer=home_page'
driver.get(url_login)

username = driver.find_element_by_id("email")
username.send_keys(user)
password = driver.find_element_by_id("password")
password.send_keys(psw)
driver.find_element_by_id("password").send_keys(Keys.ENTER)

# sleep 20 sec so page loads fully
time.sleep(20)

# collect metrics for yesterday
yesterday = datetime.date.today() - datetime.timedelta(days=1)
yesterday = str(yesterday)

# download link for metrics 
url = "https://analytics.pinterest.com/analytics/profile/" + account + "/export/?application=all&tab=impressions&end_date=" + yesterday + '&start_date=' + yesterday
driver.get(url)

# setting up file identification for pinterest CSV file
date = datetime.date.today() - datetime.timedelta(days=2)
date = str(date)[:10]
file_location = os.path.join(file_directory,'profile-'+account+'-impressions-all-'+date+'.csv')

# opening up file
test_list = []
with open(file_location,newline = '', encoding = 'utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        test_list.append(row)

# gathering relevant metrics for yesterday
this_list = test_list[1:3]

# re-organizing metrics
this_dict = {}
i=0
while(i<len(this_list[0])):
    this_dict[this_list[0][i]] = this_list[1][i]
    i+=1

return(this_dict)
driver.close()

我希望get(“ https://analytics.pinterest.com/analytics/profile/” +帐户+“ / export /?application = all&tab = impressions&end_date =” +昨天+'&start_date ='+昨天)会将CSV下载到我拥有的目录中指定。它不是。我已使用heroku run bash并进行搜索以尝试找到它,但是它不起作用。

更新,我不需要永久存储文件。我需要暂时存储并解析它。我了解在dyno重新启动后,所有操作都会丢失。

**更新**我已经用另一种方法做到了。我已将Cookie和标头传递给请求会话。我在Linux上使用了Chrome浏览器的“用户代理”。然后,我将该文件分配给一个变量(csv_file = s.get(url))。我将行分成一个数组。然后,我使用一个空字符串和.join()方法将每一行添加到一个大字符串中。然后,我通过通常将csv中的行分隔开的标识符来解析字符串。我现在有了相关的指标。

1 个答案:

答案 0 :(得分:0)

您所缺少的是heroku run bash将启动不同 dyno,而无法访问下载文件的那个的文件系统。

最好使用Heroku文件系统作为同一进程中操作的临时存储。但是,如果需要从单独的进程访问存储的文件,则应该使用其他名称,例如S3。