对于beautifulsoupMaven:如何使用多个窗格来刮取页面?

x8goxv8g  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(315)

以下是我试图搜集的网页链接:
https://www.simplyhired.ca/search?q=data+analyst&l=vancouver%2c+bc&job=grivojsfwcvast2rpqgq_ybes-tw6bcz9inhdihbt92xtkcbbcxp8g%27
更具体地说,我正试图在页面上删除“资格”元素。
打印soup对象时,我看不到右窗格的html代码。
有没有想过我该如何访问这些元素?
提前谢谢!

e7arh2l6

e7arh2l61#

您尝试刮取的页面的dom元素是使用javascript异步填充的。换句话说,当服务器向您提供页面文档时,您试图获取的信息实际上并没有被烘焙到html中,因此beautifulsoup看不到它—您得到的文档只是一个“基本”模板,通常在浏览器中查看时,会通过javascript填充,从不同的地方获取所需的信息。您可以期望大多数现代的、动态的网站都以这种方式实现。beautifulsoup只适用于那些内容在服务器提供给您时被烘焙到html中的页面。当在浏览器中查看时,页面的某些元素需要一些时间来加载,这一事实是一种即时的泄露——每当您看到这种情况时,您的第一个想法应该是“dom是使用javascript异步填充的。“美女们不会为这个工作的”。如果它是一个单页应用程序,您可以忘记beautifulsoup。
在浏览器中访问页面时,我记录了我的网络流量,并看到它发出了多个xhr(xmlhttprequest)httpget请求,其中一个请求是到一个restapi,该api提供json,其中包含您要查找的所有作业信息。您所需要做的就是使用相同的查询字符串参数(api似乎不关心请求头,这很好)模拟对同一api url的httpget请求。无需添加 selenium 或 selenium :

def main():

    import requests

    url = "https://www.simplyhired.ca/api/job"

    params = {
        "key": "grivOJsfWcVasT2RpqgQ_YBEs-tw6BCz9INhDIHbT92XtKCbBcXP8g",
        "isp": "0",
        "al": "1",
        "ia": "0",
        "tk": "1f4aknr5vs7aq800",
        "tkt": "serp",
        "from": "manual",
        "jatk": "",
        "q": "data%20analyst"
    }

    response = requests.get(url, params=params)
    response.raise_for_status()

    print(response.json()["skillEntities"])

    return 0

if __name__ == "__main__":
    import sys
    sys.exit(main())

输出:

["Tableau", "SQL"]
>>>

有关记录网络流量、查找api url和探索json响应中所有可用信息的更多信息,请参阅我的另一个答案。

相关问题