问题描述
我正在研究一个网络抓取工具,它需要打开几千个页面并获取一些数据。 由于最需要的数据字段之一仅在网站的所有javascript均已加载后才加载,因此我使用html-requests呈现页面,然后获取所需的数据。
我想知道,什么是最好的方法?
1-在脚本的开头打开一个会话,进行全部抓取操作,然后在数千次“单击”和几个小时后脚本完成后关闭该会话?
2-或者我应该在每次打开链接,呈现页面,获取数据,然后关闭会话并在一个循环中重复n次时打开会话吗?
当前我正在执行第二个选项,但是遇到了问题。这是我正在使用的代码:
def getSellerName(listingItems):
for item in listingItems:
builtURL = item['href']
try:
session = HTMLSession()
r = session.get(builtURL,timeout=5)
r.html.render()
sleep(1)
sellerInfo = r.html.search("<ul class=\"seller_name\"></ul></div><a href=\"{user}\" target=")["user"]
##
##Do some stuff with sellerinfo
##
session.close()
except requests.exceptions.Timeout:
log.exception("TimeOut Ex: ")
continue
except:
log.exception("Gen Ex")
continue
finally:
session.close()
break
这很好并且非常快。但是,大约1.5或2个小时后,我开始出现如下操作系统异常:
就这样,我一遍又一遍地得到了这个异常,直到我杀死了脚本。
我猜我在每次获取和渲染后都需要关闭其他内容,但是我不确定该做什么或是否做得正确。
有什么帮助和/或建议吗?
谢谢!
解决方法
你应该在循环外创建一个会话对象
def getSellerName(listingItems):
session = HTMLSession()
for item in listingItems:
//code