【问题标题】:Scraping with requests_html randomly gives (no) result from JS site. Timing issue?使用 requests_html 随机抓取(无)来自 JS 站点的结果。时间问题?
【发布时间】:2021-06-25 18:55:17
【问题描述】:

我想从 IMDb 抓取数据。因为beautifulsoup4 不能使用JavaScript,所以我使用html_request。 但是,我的代码随机给出(没有)结果。当我重复相同的代码 10 次时,有时它会起作用,有时它不会。 time.sleep() 没有帮助(我想也许 JS 需要更长的时间来加载)。 为什么会这样以及如何解决?

# from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://www.imdb.com/title/tt4236770/')
# time.sleep(1)
rating_show = r.html.find('.AggregateRatingButton__RatingScore-sc-1il8omz-1')[0] # either works or 'list index out of range' error
rating_show = float(rating_show.text)
rating_show

【问题讨论】:

    标签: python web-scraping python-requests-html


    【解决方案1】:

    这是因为页面的类和结构正在改变以避免刮擦。这不是由于 javascript 渲染造成的。

    顺便说一下,如果你想渲染页面,你需要在get请求之后使用渲染方法r.html.render()

    在这里,您可以绕过该类,以便像这样获得电影的符号:

    from requests_html import HTMLSession
    
    session = HTMLSession()
    r = session.get('https://www.imdb.com/title/tt4236770/')
    
    body = r.html.text
    indice = body.find('/10')
    
    print(body[indice - 3: indice])
    
    # output: Always return '8.6' 
    

    【讨论】:

    • 谢谢!当我手动检查网站时,令人困惑的是,类名总是相同的。你是怎么想出“/10”的?使用 r.html.render() 会导致“无法在现有事件循环中使用 HTMLSession。请改用 AsyncHTMLSession。”。根据谷歌的一个常见问题 - 不知道如何解决它(使用 VSC/Jupyter)
    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2016-05-06
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多