那里。我正在构建一个简单的抓取工具。这是我拥有的代码。
from bs4 import BeautifulSoup
import requests
from lxml import html
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import datetime
scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('Programming
4 Marketers-File-goes-here.json', scope)
site = 'http://nathanbarry.com/authority/'
hdr = {'User-Agent':'Mozilla/5.0'}
req = requests.get(site, headers=hdr)
soup = BeautifulSoup(req.content)
def getFullPrice(soup):
divs = soup.find_all('div', id='complete-package')
price = ""
for i in divs:
price = i.a
completePrice = (str(price).split('$',1)[1]).split('<', 1)[0]
return completePrice
def getVideoPrice(soup):
divs = soup.find_all('div', id='video-package')
price = ""
for i in divs:
price = i.a
videoPrice = (str(price).split('$',1)[1]).split('<', 1)[0]
return videoPrice
fullPrice = getFullPrice(soup)
videoPrice = getVideoPrice(soup)
date = datetime.date.today()
gc = gspread.authorize(credentials)
wks = gc.open("Authority Tracking").sheet1
row = len(wks.col_values(1))+1
wks.update_cell(row, 1, date)
wks.update_cell(row, 2, fullPrice)
wks.update_cell(row, 3, videoPrice)
该脚本在我的本地计算机上运行。但是,当我将其作为应用程序的一部分部署到Heroku并尝试运行它时,出现以下错误:
追溯(最近一次通话):
在put_feed中的文件“ /app/.heroku/python/lib/python3.6/site-packages/gspread/client.py”第219行
r = self.session.put(URL,数据,标头=标头)
将文件“ /app/.heroku/python/lib/python3.6/site-packages/gspread/httpsession.py”放入第82行
返回self.request('PUT',url,params = params,data = data,** kwargs)
请求中的文件“ /app/.heroku/python/lib/python3.6/site-packages/gspread/httpsession.py”,第69行
response.status_code,response.content))
gspread.exceptions.RequestError:(400,“ 400:b'cell_id的无效查询参数值。”)
在处理上述异常期间,发生了另一个异常:
追溯(最近一次通话):
在第44行的文件“ AuthorityScraper.py”
wks.update_cell(row,1,date)
在update_cell中的文件“ /app/.heroku/python/lib/python3.6/site-packages/gspread/models.py”,第517行
self.client.put_feed(uri,ElementTree.tostring(feed))
在put_feed中的文件“ /app/.heroku/python/lib/python3.6/site-packages/gspread/client.py”第221行
如果ex [0] == 403:
TypeError:“ RequestError”对象不支持索引
您认为什么可能导致此错误?您对我如何解决有什么建议?
最佳答案
有几件事发生:
1)Google Sheets API返回了错误:“ cell_id的查询参数值无效”:
gspread.exceptions.RequestError:(400,“ 400:b'cell_id的无效查询参数值。”)
2)gspread
中的错误在收到错误后导致异常:
TypeError:“ RequestError”对象不支持索引
Python 3从__getitem__
中删除了BaseException
,此gspread
错误处理依赖于此。这没什么大不了的,因为无论如何都会引发UpdateCellError
异常。
我的猜测是您要将无效的行号传递给update_cell
。在脚本中添加一些调试日志以显示例如正在尝试更新的行将很有帮助。
最好从零行的工作表开始,而改用append_row
。但是,在gspread
和append_row
中似乎确实有一个突出的issue,这实际上可能与您遇到的问题相同。