我正在使用代理程序支持解析器,由于使用免费代理服务器,它们通常会死掉,因此我的代码切换到其他代理服务器,这里没有问题,但是由于多次切换而重新运行函数(2-7),并且我的解析数据消失了,我确定这个问题很愚蠢,但我自己找不到,可以回复!
认为,应该以某种方式缓存var结果,因为var仅保留指向对象的链接,并且在重新运行几次链接后重新出现链接或我自己重新运行的函数中的问题,请帮助获取它。
def take():
# here I take ip:port, submit form, check if online, etc
return proxy
def con(where):
auto = take()
# proxy dict
try:
page = requests.get(where, headers={"content-type": "text"}, proxies=proxydict)
return html.fromstring(page.content)
except requests.exceptions.ConnectionError:
con(where)
goods = []
goodsp = "some xpath here"
for n in range(1, 51):
p = con("https://site&page=%s" % n)
for el in (p.xpath(goodsp)):
goods.append(el.get("href"))
所以一切正常,但是当代理服务器死掉2-7次然后重新连接时,出现此错误:
回溯(最近通话最近): 文件“ C:/Users/mi/PycharmProjects/testone/ya.py”在第67行中 对于el in(p.xpath(goodsp)): AttributeError:“ NoneType”对象没有属性“ xpath”
所以我的p var变为None,我应该怎么做才能随身携带它?
答案 0 :(得分:1)
要详细说明@depperm的注释,问题可能出在您的递归函数未返回任何内容。例如,您的执行流程可能如下:
con(where) <- which DOESN'T return HTML to this one<-|
-> error |
-> con(where) |<-to this call here-|
-> error |
-> con(where) |
-> success -> returns HTML -> -> -> |
但是,如果您更改了区块
except requests.exceptions.ConnectionError:
con(where)
收件人:
except requests.exceptions.ConnectionError:
return con(where)
然后,生成的HTML将通过您期望的所有递归函数反馈到链的上游(或者,我们相信,但由于不是MCVE
,因此无法确认)