Python - 使用 HTML 标签进行网页抓取

Python - Web scraping using HTML tags

我正在尝试抓取 web-page 以列出 URL 中发布的职位:https://careers.microsoft.com/us/en/search-results?rk=l-hyderabad

参考图片了解web-page检查Web inspect

的详细信息

通过 web-page 检查观察到以下内容:

  1. 列出的每个职位都在 HTML 里,class="jobs-list-item"。 Li 包含以下 html 标签和数据 parent Div within li

    data-ph-at-job-title-text="Software Engineer II", data-ph-at-job-category-text="Engineering", data-ph-at-job-post-date-text="2018-03-19T16:33:00".

  2. 第一个 Child Div parent Div 和 class="information" 有 HTML url href="https://careers.microsoft.com/us/en/job/406138/Software-Engineer-II"

  3. 第 3 child Div class="description au-target" parent Div 职位描述较短

我的要求是为每个工作提取以下信息

  1. 职位
  2. 职位类别
  3. 工作Post日期
  4. 工作Post时间
  5. 工作URL
  6. 职位简短描述

我已尝试按照 Python 代码抓取网页,但无法提取所需信息。 (请忽略下面代码中的缩进)

import requests
from bs4 import BeautifulSoup
def ms_jobs():
url = 'https://careers.microsoft.com/us/en/search-results?rk=l-hyderabad'
resp = requests.get(url)

if resp.status_code == 200:
print("Successfully opened the web page")
soup = BeautifulSoup(resp.text, 'html.parser')
print(soup)
else:
print("Error")

ms_jobs()

如果您想通过请求执行此操作,您需要对网站进行逆向工程。在 Chrome、select 网络选项卡中打开开发工具并填写表格。

这将向您展示网站如何加载数据。如果您深入了解该站点,您会看到它通过对该端点执行 POST 来获取数据:https://careers.microsoft.com/widgets。它还向您显示该站点使用的负载。该站点使用 cookie,因此您所要做的就是创建一个保留 cookie 的会话,获取一个并 copy/paste 有效负载。

通过这种方式,您将能够提取相同的 json 数据,javascript 获取这些数据以动态填充站点。

下面是一个工作示例。左边只是按照您认为合适的方式解析 json。

import requests
from pprint import pprint

# create a session to grab a cookie from the site
session = requests.Session()
r = session.get("https://careers.microsoft.com/us/en/")

# these params are the ones that the dev tools show that site sets when using the website form
payload = {
    "lang":"en_us",
    "deviceType":"desktop",
    "country":"us",
    "ddoKey":"refineSearch",
    "sortBy":"",
    "subsearch":"",
    "from":0,
    "jobs":"true",
    "counts":"true",
    "all_fields":["country","state","city","category","employmentType","requisitionRoleType","educationLevel"],
    "pageName":"search-results",
    "size":20,
    "keywords":"",
    "global":"true",
    "selected_fields":{"city":["Hyderabad"],"country":["India"]},
    "sort":"null",
    "locationData":{}
}

# this is the endpoint the site uses to fetch json
url = "https://careers.microsoft.com/widgets"
r = session.post(url, json=payload)
data = r.json()
job_list = data['refineSearch']['data']['jobs']

# the job_list will hold 20 jobs (you can se the parameter in the payload to a higher number if you please - I tested 100, that returned 100 jobs
job = job_list[0]
pprint(job)

干杯。