Python 网络抓取/数据提取
Python web scraping/ data extraction
对于我的硕士论文,我正在探索通过网络自动化从网站提取数据的可能性。步骤如下:
- 登录网站 (https://www.metal.com/Copper/201102250376)
- 输入用户名和密码
- 点击登录
- 将日期更改为 01/01/2020
- 抓取生成的table数据,然后将其保存到csv文件
- 保存到我 PC 上具有特定名称的特定文件夹
- 运行 在同一浏览器的新选项卡中以相同的顺序下载其他材料的附加历史价格数据 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 下载,我也在探索通过提供的下载按钮直接保存文件的可能性。
- 我遇到的问题是无法直接指定要保存的文件名
- 点击后,下载按钮会打开一个新标签页,然后关闭
在几秒钟内初始化文件下载。
- 然后文件与 materialcode-today's date 文件一起下载
命名格式。
你知道怎么做吗?
sign in
按钮没有被点击的原因是因为 xpath //*[@id="__next"]/div/div[3]/div[2]/div[2]/button[2]
不正确 next
的 id
是主容器 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
对于我的硕士论文,我正在探索通过网络自动化从网站提取数据的可能性。步骤如下:
- 登录网站 (https://www.metal.com/Copper/201102250376)
- 输入用户名和密码
- 点击登录
- 将日期更改为 01/01/2020
- 抓取生成的table数据,然后将其保存到csv文件
- 保存到我 PC 上具有特定名称的特定文件夹
- 运行 在同一浏览器的新选项卡中以相同的顺序下载其他材料的附加历史价格数据 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 下载,我也在探索通过提供的下载按钮直接保存文件的可能性。
- 我遇到的问题是无法直接指定要保存的文件名
- 点击后,下载按钮会打开一个新标签页,然后关闭 在几秒钟内初始化文件下载。
- 然后文件与 materialcode-today's date 文件一起下载 命名格式。
你知道怎么做吗?
sign in
按钮没有被点击的原因是因为 xpath //*[@id="__next"]/div/div[3]/div[2]/div[2]/button[2]
不正确 next
的 id
是主容器 div
通过我们通过提供剩余的 html 节点结构
sign button
相反,您可以根据其 class 值
//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