那里。我正在构建一个简单的抓取工具。这是我拥有的代码。
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并尝试运行它时,我收到以下错误:
追踪(最近一次通话): 文件&#34; /app/.heroku/python/lib/python3.6/site-packages/gspread/client.py" ;,第219行,在put_feed中 r = self.session.put(url,data,headers = headers) 文件&#34; /app/.heroku/python/lib/python3.6/site-packages/gspread/httpsession.py" ;,第82行,放入 return self.request(&#39; PUT&#39;,url,params = params,data = data,** kwargs) 文件&#34; /app/.heroku/python/lib/python3.6/site-packages/gspread/httpsession.py",第69行,请求中 response.status_code,response.content)) gspread.exceptions.RequestError:(400,&#34; 400:b&#39; cell_id的查询参数值无效。&#39;&#34;)
在处理上述异常期间,发生了另一个异常:
追踪(最近一次通话): 文件&#34; AuthorityScraper.py&#34;,第44行,in wks.update_cell(第1行,第1行) 文件&#34; /app/.heroku/python/lib/python3.6/site-packages/gspread/models.py",第517行,在update_cell中 self.client.put_feed(uri,ElementTree.tostring(feed)) 文件&#34; /app/.heroku/python/lib/python3.6/site-packages/gspread/client.py" ;,第221行,在put_feed中 如果ex [0] == 403: TypeError:&#39; RequestError&#39; object不支持索引
您认为可能导致此错误的原因是什么?您对我如何解决它有什么建议吗?
答案 0 :(得分:2)
有几件事情在发生:
1)Google表格API返回了一个错误:&#34; cell_id&#34;的无效查询参数值:
gspread.exceptions.RequestError:(400,&#34; 400:b&#39; cell_id的查询参数值无效。&#39;&#34;)
2)gspread
中的错误在收到错误后导致异常:
TypeError:&#39; RequestError&#39; object不支持索引
Python 3从__getitem__
中删除了BaseException
,gspread
错误处理依赖于此UpdateCellError
。这并不重要,因为无论如何它都会引发update_cell
例外。
我的猜测是您将无效的行号传递给append_row
。将一些调试日志记录添加到您的脚本以显示(例如,它正在尝试更新的行)会很有帮助。
最好从零行的工作表开始,然后使用gspread
。但是append_row
{{1}}中的{{1}}似乎确实存在{{1}},实际上可能与您遇到的问题相同。
答案 1 :(得分:0)
我遇到了同样的问题。 BS4在本地计算机上运行良好。但是,由于某种原因,它在Heroku服务器中太慢了,导致出现错误。
我切换到lxml,现在可以正常工作了。
通过命令安装:
pip install lxml
下面是示例代码段:
from lxml import html
import requests
getpage = requests.get("https://url_here")
gethtmlcontent = html.fromstring(getpage.content)
data = gethtmlcontent.xpath('//div[@class = "class-name"]/text()')
#this is a sample for fetching data from the dummy div
data = data[0:n] # as per your requirement
#now inject the data into django tmeplate.