【问题标题】:How to wait a page to load before getting data with requests.get in python and without using api如何在 python 中使用 requests.get 获取数据之前等待页面加载而不使用 api
【发布时间】:2019-04-25 08:28:33
【问题描述】:

我正在使用 Python 和 requests 库进行网络抓取。我在加载页面时遇到问题,我想让 requests.get() 在得到结果之前等待。

我看到一些人使用 Selenium 解决了同样的“问题”,但我不想使用其他 API。我想知道是否可以只使用 urllib、urllib2 或请求。

我尝试将 time.sleep() 放在 get 方法中,但没有成功。 看来我需要在显示之前找到网站获取数据的位置,但我找不到。

import requests

def search():
        url= 'https://academic.microsoft.com/search?q=machine%20learning'
        mySession = requests.Session()
        response = mySession.get(url)
        myResponse = response.text

响应是加载页面的html代码(如果你去代码中的链接你可以看到它)和加载块但是我需要得到研究的结果。

【问题讨论】:

    标签: python python-3.x web-scraping python-requests


    【解决方案1】:

    requests 无法从 ajax 获取加载的元素。见this explanation from w3schools.com

    从网络服务器读取数据 - 在网页加载后

    requests 唯一要做的就是下载 html,但它不解释 javascript 代码,因此无法加载通常通过 web 浏览器(或使用 Selenium)中的 ajax 加载的元素。

    【讨论】:

    • 我明白了,非常感谢你的回答!!
    【解决方案2】:

    此站点正在发出另一个请求并使用 javascript 来呈现它。你不能用requests 执行javascript。这就是为什么有些人使用Selenium

    https://academic.microsoft.com/search?q=machine%20learning 不意味着在没有浏览器的情况下使用。

    如果您想要专门来自 academic.microsoft.com 的数据,请使用他们的 api。

    import requests
    
    url = 'https://academic.microsoft.com/api/search'
    
    data = {"query": "machine learning",
            "queryExpression": "",
            "filters": [],
            "orderBy": None,
            "skip": 0,
            "sortAscending": True,
            "take": 10}
    
    r = requests.post(url=url, json=data)
    
    result = r.json()
    

    您将获得格式良好且易于使用的数据。

    【讨论】:

    • 你完全解决了我的问题。事实上,这是我唯一遇到过此类问题的地方,我在 Google Scholar 和其他人(使用标题、cookie 等)上做了同样的事情,而且效果很好。你的回答和另一个帮助我更好地理解了我在做什么。非常感谢!!
    猜你喜欢
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2017-05-13
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多