Python 网络抓取/数据提取

Python web scraping/ data extraction

对于我的硕士论文,我正在探索通过网络自动化从网站提取数据的可能性。步骤如下:

  1. 登录网站 (https://www.metal.com/Copper/201102250376)
  2. 输入用户名和密码
  3. 点击登录
  4. 将日期更改为 01/01/2020
  5. 抓取生成的table数据,然后将其保存到csv文件
  6. 保存到我 PC 上具有特定名称的特定文件夹
  7. 运行 在同一浏览器的新选项卡中以相同的顺序下载其他材料的附加历史价格数据 window

我卡在了第 5、6 和 7 步

从硒导入 webdriver

DRIVER_PATH = 'C:\webdriver\chromedriver.exe' 驱动程序 = webdriver.Chrome(executable_path=DRIVER_PATH, chrome_options=ChromeOptions)

driver.maximize_window()

driver.get('https://www.metal.com/Copper/201102250376')

#登录步骤 LoginClick1 = driver.find_element_by_css_selector( '#__next > div > div.smm-component-header-en > div.main > div.right > button.button.sign-in')

LoginClick1.click()

user_input = driver.find_element_by_id('user_name') user_input.send_keys('#####')

password_input = driver.find_element_by_id('password') password_input.send_keys('####')

提交=driver.find_element_by_css_selector( 'body > div:nth-child(17) > div > div.ant-modal-wrap.ant-modal-centered.smm-component-sign-en > div > div.ant-modal-content > div > div > div > div.smm-component-sign-en-content > form > div:nth-child(3) > div > div > span > button')

Submit.click()

time.sleep(2)

#向下滚动页面中的兴趣点 driver.execute_script("window.scrollBy(0,1000)", "")

#更改货币 driver.find_element(By.XPATH,"//img[包含(@class,'icon___BUqam')]").click()

time.sleep(1)

#从日期选择器更改日期

date_input = driver.find_element_by_xpath( '//*[@id="__next"]/div/div[5]/div1/div[7]/div1/div2/div1/span1/div/i')

date_input.click()

action = ActionChains(驱动程序)

action.move_to_element(date_input).send_keys(Keys.BACKSPACE).send_keys( Keys.BACKSPACE).send_keys(Keys.BACKSPACE).send_keys(Keys.BACKSPACE).send_keys(Keys.BACKSPACE).send_keys(Keys.BACKSPACE).send_keys(Keys.BACKSPACE).send_keys(Keys.BACKSPACE).send_keys(Keys.BACKSPACE).send_keys(Keys.BACKSPACE).执行()

action.move_to_element(date_input).send_keys("01/01/2020").perform() action.move_to_element(date_input).send_keys(Keys.ENTER).perform()

time.sleep(2)

我一直在尝试从生成的 table 中抓取数据,然后使用 selenium 将其保存到 csv 文件中。请参阅下面的 HTML 代码 table generated

**2022 年 5 月 27 日** **10,758.75-10,788.43** **10,773.59** **+97.94** **USD/mt**

如有任何帮助,我们将不胜感激。

Download file using button press Download button

driver.find_element(By.XPATH,"//img[contains(@src,'https://static.metal.com/www.metal.com/4.1.161/static/images/price/download.png')]").click()

time.sleep(1)

driver.find_element(By.XPATH,"//img[contains(@src,'https://static.metal.com/www.metal.com/4.1.161/static/images/price/download_excel.png')]").click()

为了节省时间,因为我有多个 files/data 下载,我也在探索通过提供的下载按钮直接保存文件的可能性。

你知道怎么做吗?

sign in 按钮没有被点击的原因是因为 xpath //*[@id="__next"]/div/div[3]/div[2]/div[2]/button[2] 不正确 nextid 是主容器 div 通过我们通过提供剩余的 html 节点结构

来导航到 sign button

相反,您可以根据其 class 值

直接将登录按钮 select 作为 //button[@class='button sign-in']

您的登录解决方案如下所示

driver = webdriver.Chrome(executable_path='C:\webdrivers\chromedriver.exe')
driver.maximize_window()
driver.get('https://www.metal.com/Nickel/201102250239')
# Click on Sign In
driver.find_element(By.XPATH, "//button[@class='button sign-in']").click()
# Enter username
driver.find_element(By.ID, "user_name").send_keys("your username")
# Enter password
driver.find_element(By.ID, "password").send_keys("your password") 
# Click Sign In
driver.find_element(By.XPATH, "//button[@type='submit']").click()

To scrape data

for element in driver.find_elements_by_class_name("historyBodyRow___1Bk9u"):
 elements =element.find_elements_by_tag_name("div")
 print("Date="+ elements[0].text)
 print("Price Range="+ elements[1].text)
 print("Avg="+ elements[2].text)
 print("Change="+ elements[3].text)
 print("Unit="+ elements[4].text)

Add To CSV

import csv
f = open('Path where you want to store the file', 'w')
writer = csv.writer(f)
for element in driver.find_elements_by_class_name("historyBodyRow___1Bk9u"):
  elements =element.find_elements_by_tag_name("div")
  entry = [elements[0].text ,elements[1].text ,elements[2].text , elements[3].text, elements[4].text]
  writer.writerow(entry)

f.close