【问题标题】:Extract Xpath from multiple different web addresses to excel file with python使用python从多个不同的网址中提取Xpath到excel文件
【发布时间】:2021-03-22 15:29:33
【问题描述】:

我正在尝试加快 python 代码将超市网站的 Xpath(商店营业时间和营业时间)提取到 excel 文件。我使用的代码有效,但是它需要添加额外的代码行,包括新的网址和行标识符。

我有一个包含所有需要访问的网址的文本文件,并且到目前为止,每个网址的 Xpath 都是相同的。 python可以读取任意网址的文件列表提取Xpath(存储时间)并输出到excel文件而不用写很多行代码吗?

import selenium 
from selenium import webdriver
import pandas as pd
import time

def s1():
    driver = webdriver.Chrome('C:/Users/Me/Documents/PY/chromedriver.exe')
    driver.get("https://local.albertsons.com/mt/belgrade/6999-jackrabbit- 
    ln.html")
    time.sleep(2)
    a = driver.find_element_by_xpath('//* 
    [@id="mainStoreHours"]/div/table/tbody/tr[1]/td[2]/span/span[1]').text
    b = driver.find_element_by_xpath('//* 
    [@id="mainStoreHours"]/div/table/tbody/tr[1]/td[2]/span/span[3]').text
    time.sleep(1)
    df = pd.DataFrame({'Open Time' :a, 'Close Time' :b}, index=[9])
    driver.close()
    driver = webdriver.Chrome('C:/Users/Me/Documents/PY/chromedriver.exe')
    driver.get("https://local.albertsons.com/mt/bozeman/200-s-23rd-ave.html")
    time.sleep(2)
    c = driver.find_element_by_xpath('//* 
    [@id="mainStoreHours"]/div/table/tbody/tr[1]/td[2]/span/span[1]').text
    d = driver.find_element_by_xpath('//* 
    [@id="mainStoreHours"]/div/table/tbody/tr[1]/td[2]/span/span[3]').text
    time.sleep(1)
    df1 = pd.DataFrame({'Open Time' :c, 'Close Time' :d}, index=[6])
    driver.close()
    df_all = pd.concat([df, df1])
    df_all.to_excel('Storehours.xlsx')

【问题讨论】:

  • 无需为每个站点打开和关闭浏览器。只需重用浏览器即可使其运行得更快。如果您希望它运行得非常快,您可以编写线程化,每次运行都会打开它自己的浏览器、抓取数据并关闭,但您当前的代码不是线程化的。

标签: python selenium


【解决方案1】:

试试看:

import csv
import time

from selenium import webdriver


def make_action(url, b1, b2):
    driver.get(url)
    time.sleep(1)
    a = driver.find_element_by_xpath(b1).text
    b = driver.find_element_by_xpath(b2).text
    return url, a, b

driver = webdriver.Chrome()
with open('file_pages.txt', newline='\n') as csvfile, open('new_file.csv', 'w+', newline='\n') as new_f:
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='|')
    next(spamreader)
    file = csv.writer(new_f, delimiter=',')
    for row in spamreader:
        file.writerow(make_action(*row))

driver.quit()

file_pages.txt 文件应如下所示:

url,b1,b2
https://local.albertsons.com/mt/belgrade/6999-jackrabbit-ln.html,//*[@id="mainStoreHours"]/div/table/tbody/tr[1]/td[2]/span/span[1],//span[@class='c-hours-details-row-intervals-instance-close'][1]
https://local.albertsons.com/mt/belgrade/6999-jackrabbit-ln.html,//*[@id="mainStoreHours"]/div/table/tbody/tr[1]/td[2]/span/span[1],//span[@class='c-hours-details-row-intervals-instance-close'][1]

其中 url 是 url,b1 - 按钮或元素 1,b2 - 按钮或元素 2

顺便说一句,我的建议是使用 webdriver-manager 包:

pip install webdriver-manager

代码看起来像这样,但你不必再担心 chromedriver 它会在没有你的情况下下载和替换,真的很方便:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())

【讨论】:

  • OP 表示 XPath 始终相同,因此无需将它们存储在 CSV 中。您的输出也与 OP 的代码格式不同。
  • time.sleep(1) 与正确的WebDriverWait 交换为第一个元素。也不需要在每个循环中打开和关闭一个新的驱动程序。我知道这是 OP 所做的,但没有必要。如果它作为单独的线程测试运行,那将是有意义的,但这不是线程的。
  • 另外,您的第二个网址是第一个网址的副本,而不是 OP 在其代码中的内容。
  • @JeffC 没有注意到相同的 xpath,至于 WebDriverWait,有快速的解决方案,您是否建议在这里使用页面对象?并且重复的 url 显示,这是通用的解决方案。您可以将它用于不同的站点。是的,驱动程序可以打开一次并移动到不同的浏览器只需使用get,很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多