【问题标题】:python selenium webscraping (clicking buttons which shows data and then extracting it)python selenium web scraping(单击显示数据的按钮然后提取它)
【发布时间】:2021-11-05 11:34:45
【问题描述】:

所以我要做的是:https://www.jobbank.gc.ca/jobsearch/jobsearch?sort=D&fsrc=16&fbclid=IwAR2SIG3lbY1S9lO4WilcKw6TxJAJQbFIGYTVE_tOTqYRpb43qM3uYgLWV64,

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
import os
s = Service('C:\Program Files (x86)\chromedriver.exe')
driver = webdriver.Chrome(service=s)
driver.get('https://www.jobbank.gc.ca/jobsearch/jobsearch?sort=D&fsrc=16&fbclid=IwAR2SIG3lbY1S9lO4WilcKw6TxJAJQbFIGYTVE_tOTqYRpb43qM3uYgLWV64')

# Get titles of Job listings
elements = []
for element in driver.find_elements(By.CLASS_NAME, 'resultJobItem'):
    title = element.find_element(By.XPATH, './/*[@class="noctitle"]').text
    if title not in elements:
        elements.append({'Title': title.split('\n')})

# Get all href
link = driver.find_elements(By.XPATH, './/*[@class="results-jobs"]/article/a')
for links in link:
    elements.append({'Link': links.get_attribute('href')})

print(elements)

【问题讨论】:

    标签: python selenium web-scraping


    【解决方案1】:

    看起来你可以使用他们自己的 api 和一个 post 请求来获取数据。

    您需要抓取作业 ID。

    所以对于这个网址上的工作:https://www.jobbank.gc.ca/jobsearch/jobposting/35213663 我看到工作 ID 是 1860693。所以我需要发布这样的请求。

    import requests
    from bs4 import BeautifulSoup as BS
    
    url = "https://www.jobbank.gc.ca/jobsearch/jobposting/35213663"  
    jobid = "1860693"
    data = {
      'seekeractivity:jobid': f'{jobid}',
      'seekeractivity_SUBMIT': '1',
      'javax.faces.ViewState': 'stateless',
      'javax.faces.behavior.event': 'action',
      'jbfeJobId': f'{jobid}',
      'action': 'applynowbutton',
      'javax.faces.partial.event': 'click',
      'javax.faces.source': 'seekeractivity',
      'javax.faces.partial.ajax': 'true',
      'javax.faces.partial.execute': 'jobid',
      'javax.faces.partial.render': 'applynow',
      'seekeractivity': 'seekeractivity'
    }
    
    response = requests.post(url, data)
    
    soup = BS(response.text)
    email = soup.a.text
    print(email)
    this gives me
    >> info@taylorlumber.ca
    

    【讨论】:

    • 嘿,您是如何知道要包含在 data 变量中的所有属性的?
    • 我在 chrome 的 devtools 中检查了请求
    【解决方案2】:

    我会单独存储所有链接。
    因此假设以下变量all_links 包含所有链接。现在,

    .
    .
    .
    driver.quit()
    
    link1 = all_links[0] # lets take the example of the first link. youd have to for loop through all the link; for link in links
    
    new_driver = webdriver.Chrome(service=s)
    new_driver.get(link1)
    
    new_driver.find_element_by_css_selector("#applynowbutton").click()
    

    此时“显示如何应用”按钮已被点击。

    不幸的是,我对 html 了解不多,但基本上在这一点上,您可以像之前提取所有链接一样提取电子邮件

    【讨论】:

      【解决方案3】:

      尝试如下:

      可以将scrollIntoView 应用于特定的工作选项。当它到达末尾时,单击Show more 选项并继续提取详细信息。

      driver.get("https://www.jobbank.gc.ca/jobsearch/jobsearch?sort=D&fsrc=16&fbclid=IwAR2SIG3lbY1S9lO4WilcKw6TxJAJQbFIGYTVE_tOTqYRpb43qM3uYgLWV64")
      
      i = 0
      while True:
          try:
              jobs = driver.find_elements_by_xpath("//div[@class='results-jobs']/article")
              driver.execute_script("arguments[0].scrollIntoView(true);",jobs[i])
              title = jobs[i].find_element_by_xpath(".//span[@class='noctitle']").text
              link = jobs[i].find_element_by_tag_name("a").get_attribute("href")
              print(f"{i+1} - {title} : {link}")
              i+=1
              if i == 100:
                  break
          except IndexError:
              driver.find_element_by_id("moreresultbutton").click()
              time.sleep(3)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-28
        • 1970-01-01
        • 2021-08-19
        • 2019-01-31
        • 1970-01-01
        • 2020-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多