微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python请求-HTML会话获取正确用法

如何解决Python请求-HTML会话获取正确用法

我正在研究一个网络抓取工具,它需要打开几千个页面获取一些数据。 由于最需要的数据字段之一仅在网站的所有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个小时后,我开始出现如下操作系统异常:

操作系统错误:[错误24]打开的文件太多

就这样,我一遍又一遍地得到了这个异常,直到我杀死了脚本。

我猜我在每次获取和渲染后都需要关闭其他内容,但是我不确定该做什么或是否做得正确。

有什么帮助和/或建议吗?

谢谢!

解决方法

你应该在循环外创建一个会话对象

def getSellerName(listingItems):
    session = HTMLSession()
    for item in listingItems:
    //code

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。