用Python和Selenium从动态网站抓取Web

2024-05-12 15:30:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我昨天问了一个问题,从@QHarr那里得到了一个答案,像Workday这样的动态网站(以https://wd1.myworkdaysite.com/recruiting/upenn/careers-at-penn为例)通过发出额外的XHR请求来生成职位链接。因此,如果我想提取特定的工作岗位链接,使用HTML解析或CSS选择器按关键字进行刮取的正常网页是不可行的,而链接无法从Selenium驱动程序生成的HTML源代码中提取。(基于WeiZhang2017的GitHub帖子:https://gist.github.com/Weizhang2017/0029b2ff59e943ca9f024c117fbdf88a

在我的例子中,像Workday这样的网站在需要时使用Ajax加载数据,我使用Selenium模拟页面向下滚动并根据需要获取更多数据。然而,关于使用Selenium获取JSON响应,我搜索了很多,但没有找到适合我需要的答案

一般来说,我的想法是通过3个步骤提取特定职位的链接:

  1. 使用Selenium加载并向下滚动网站
  2. 在Selenium中使用类似的方法,如request.get().json(),以获取向下滚动的网站的json响应数据
  3. 使用我的特定关键字搜索JSON响应数据,以获得特定帖子的链接

然而,我的问题来了

第1步:我通过一个循环来向下滚动我想要的页面。没问题

scroll = 3
while scroll:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(3)
    scroll = scroll -1

第二步:我不知道什么样的方法可以在搜索了很多之后起作用,也找不到一个简单易懂的答案。(我不熟悉Python和Selenium,对动态网站的理解有限抓取

第三步:我想一旦获得了Chrome Inspect网络预览中显示的JSON数据(假设它名为log),我就可以处理搜索并获得我想要的(特定职位的链接)

list = ['https://wd1.myworkdaysite.com' + x['title']['commonlink'] for x in log['body']['children'][0]['children'][0]['listItems'] if x['instance'][0]['text']==mySpecificWords]

感谢您对step2解决方案的任何想法


Tags: 数据答案httpscomjson网站链接html