Python 从LinkedIn中删除职位描述
我创建了一个python脚本,它使用Selenium的库进行刮取:Python 从LinkedIn中删除职位描述,python,selenium,web-scraping,Python,Selenium,Web Scraping,我创建了一个python脚本,它使用Selenium的库进行刮取: 职称 公司名称 工作地点 工作描述(我需要得到帮助!),摘自LinkedIn工作搜索部分 我已经创建了一个for循环来迭代(25)个作业,以使用每个描述使用的相同类名提取每个作业的描述。我已经能够成功地提取出(1)个描述,但还不能提取出其余(24)个工作的其他描述。我假设它的循环无法解析每个部分,但是如果它能够成功地拉出(1)个描述,为什么其他的描述没有出现呢 将熊猫作为pd导入 进口稀土 从selenium导入webdriv
将熊猫作为pd导入
进口稀土
从selenium导入webdriver
从selenium.webdriver.common.keys导入密钥
#这将打开一个新的Chrome页面来测试指定的url(用于抓取)
browser=webdriver.Chrome(“我的Chrome路径”)
browser.get(“https://www.linkedin.com")
#要求用户输入用户名和密码
用户名=浏览器。按id(“会话密钥”)查找元素
用户名。发送密钥(“输入用户名”)
密码=浏览器。通过id(“会话密码”)查找元素
密码。发送密钥(“输入密码”)
#输入用户名和密码后,将自动单击提交按钮登录LinkedIn
login\u button=browser.通过类名称查找元素(“登录表单提交按钮”)
登录按钮。单击()
#这是一个URL,用于测试我想从中获取的作业
browser.get(“https://www.linkedin.com/jobs/search/?keywords=software%20developer")
#这将从第(1)页中刮取并显示(25)个职务
job\u title=浏览器。按类名称查找元素(“job-card-list\u title”)
公司名称=[]
对于我的职位名称:
公司名称附加(i.text)
印刷品(公司名称)
打印()
印刷品(len(公司名称))
#这将从第(1)页中刮取并显示(25)个公司名称-对应于上述公司名称
job\u company=browser.通过类名称(“job-card-container\u company-name”)查找元素
公司名称=[]
对于我在job_公司:
公司名称。附加(i.text)
打印(公司名称)
打印()
打印(len(公司名称))
#这将从第(1)页中刮取并显示(25)个位置名称-对应于上面的公司名称和公司名称
job\u location=browser.通过类名称(“job-card-container\uu metadata-item”)查找元素
位置\名称=[]
对于我在工作地点的情况:
位置\名称.附加(i.text)
打印(位置和名称)
打印()
打印(len(位置和名称))
#在这一点上,我试图迭代(25)个作业中的每一个,以提取描述。我已经成功地提取了(1)个描述,但无法提取其余(24)个工作的其他描述。
job\u description=浏览器。按类名称查找元素(“jobs-search\u right-rail”)
description_name=[]
对于工作描述中的i:
description_name.append(i.text)
打印(说明和名称)
打印()
打印(len(description_name))
问题与如何加载页面有关。
每次单击新作业容器时,它都会向服务器发送不同的GET请求
This link, by default, has the first job selected.
https://www.linkedin.com/jobs/search/?keywords=software%20developer
When you click another page, it changes the job id.
Example:
https://www.linkedin.com/jobs/search/?currentJobId=2512009247&keywords=software%20developer
因此,您可以模拟单击容器,也可以通过从页面中删除id并使用新链接重新加载页面来更改currentJobId
# Example of scraping the currentJobId for each item.
job_containers = browser.find_elements_by_class_name('job-card-container relative job-card-list job-card-container--clickable job-card-list--underline-title-on-hover jobs-search-results-list__list-item--active jobs-search-two-pane__job-card-container--viewport-tracking-0')
job_ids = []
for job_container in job_containers:
job_ids.append(job_container.get_attribute("data-job-id"))
函数获取描述
def get_descriptions(browser, job_ids):
job_descriptions = []
for job_id in job_ids:
browser.get(f'https://www.linkedin.com/jobs/search/?currentJobId={job_id}&keywords=software%20developer')
job_description = browser.find_elements_by_class_name('jobs-search__right-rail')[0].text
job_descriptions.append(job_description)
return job_descriptions
谢谢@Steven Posterick。每次作业ID更改时我都必须使用此选项吗?另外,您知道如何将ID与更新的链接相匹配吗?@WeeklyButterfly34不确定作业ID的更改频率,但我会在检索作业ID后立即查询描述。我已经编辑了我的答案,展示了一个如何让它抓取带有工作id的描述的示例。我感谢这里的更新和帮助。我已经将id填充到LinkedIn链接中,链接上写着{job_id}。在这一点上,我想知道如果所有描述都存储在get_descriptions函数内声明的job_descriptions数组中,如何查看这些描述。它是从方法返回的,因此要获取job_descriptions数组,您只需执行以下操作:job_descriptions=get_descriptions(浏览器,job_id)然后循环遍历数组。我只是循环了get_descriptions函数。在returnjob_description语句之后,我简单地说:print(job_description)获取所有文本内容。谢谢你@Steven Posterick