繁体   English   中英

使用 Selenium 进行 Python 网页抓取 - 遍历 href 链接

Python web scraping using Selenium - iterate through href link

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试编写一个脚本,使用 selenium 下载许多包含不同 NHL 球员信息的文件; 游戏日志。 我想为下表中的每个玩家下载一个文件: https : //www.naturalstattrick.com/playerteams.php?fromseason=20142015&thruseason=20162017&stype=2&sit=all&score=all&stdoi=std&rate=y&team=ALL&pos=S&loc=B&toi 0.1&gpfilt=none&fd=&td=&tgp=410&lines=single

在那个网站上,我想点击表格中所有玩家的名字。 当通过 href 链接单击玩家姓名时,会打开一个新窗口。 顶部有几个下拉菜单。 我想选择“Rate”而不是“Counts”,还要选择“Game Log”而不是“Player Summary”,然后单击“Submit”。 最后,我想点击底部的 CSV(All) 来下载一个 CSV 文件。

这是我当前的代码:

from selenium import webdriver
import csv
from selenium.webdriver.support.ui import Select
from datetime import date, timedelta
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

 chromedriver =("C:/Users/Michel/Desktop/python/package/chromedriver_win32/chromedriver.exe")
 driver = webdriver.Chrome(chromedriver)

driver.get("https://www.naturalstattrick.com/playerteams.php?fromseason=20142015&thruseason=20162017&stype=2&sit=all&score=all&stdoi=std&rate=y&team=ALL&pos=S&loc=B&toi=0.1&gpfilt=none&fd=&td=&tgp=410&lines=single")
table = driver.find_element_by_xpath("//table[@class='indreg dataTable no-footer DTFC_Cloned']")
for row in table.find_elements_by_xpath("//tr[@role='row']")
    links = driver.find_element_by_xpath('//a[@href]')
    links.click()
    select = Select(driver.find_element_by_name('rate'))
    select.select_by_value("y")
    select1 = Select(driver.find_element_by_name('v'))
    select1.select_by_value("g")
    select2 = Select(driver.find_element_by_type('submit'))
    select2.select_by_value("submit")
    WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH , '//div[@class="dt-button button-csv button-htm15"]')))
    CSVall = driver.find_element_by_xpath('//div[@class="dt-button button-csv button-htm15"]')
    CSVall.click()
driver.close()

我试图改变不同的东西,但我总是得到一个错误。 问题出在哪儿 ?

此外,我想我应该添加一行来等待网站加载,因为它需要几秒钟; 在“driver.get”之后。 我不知道在这种情况下结束等待的预期条件是什么。

谢谢

2 个回复

你不需要点击每个播放器链接,而是将 URL 保存为列表,也有几个错误,你可以看到下面的工作代码

from selenium import webdriver
import csv
from selenium.webdriver.support.ui import Select
from datetime import date, timedelta
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

chromedriver =("C:/Users/Michel/Desktop/python/package/chromedriver_win32/chromedriver.exe")
driver = webdriver.Chrome(chromedriver)

driver.get("https://www.naturalstattrick.com/playerteams.php?fromseason=20142015&thruseason=20162017&stype=2&sit=all&score=all&stdoi=std&rate=y&team=ALL&pos=S&loc=B&toi=0.1&gpfilt=none&fd=&td=&tgp=410&lines=single")

playerLinks = driver.find_elements_by_xpath("//table[@class='indreg dataTable no-footer DTFC_Cloned']//a")
playerLinks = [p.get_attribute('href') for p in playerLinks]

print(len(playerLinks))

for url in playerLinks:
    driver.get(url)
    select = Select(driver.find_element_by_name('rate'))
    select.select_by_value("y")
    select1 = Select(driver.find_element_by_name('v'))
    select1.select_by_value("g")
    driver.find_element_by_css_selector('input[type="submit"]').click()
    WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH , '//a[@class="dt-button buttons-csv buttons-html5"][2]')))
    CSVall = driver.find_element_by_xpath('//a[@class="dt-button buttons-csv buttons-html5"][2]')
    CSVall.click()

driver.close()

您可以从第一页获取 playerIds 并将它们与代表 Rate 和 Game Log 选项的字符串连接到新 URL 的 queryString 部分中,而不是一直点击选择项。 当然,您可以整理以下内容。

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

def getPlayerId(url):
    id = url.split('playerid=')[1] 
    id = id.split('&')[0]
    return id

def makeNewURL(playerId):
    return 'https://www.naturalstattrick.com/playerreport.php?fromseason=20142015&thruseason=20162017&stype=2&sit=all&stdoi=oi&rate=y&v=g&playerid=' + playerId

#chromedriver =("C:/Users/Michel/Desktop/python/package/chromedriver_win32/chromedriver.exe")
driver = webdriver.Chrome()

driver.get("https://www.naturalstattrick.com/playerteams.php?fromseason=20142015&thruseason=20162017&stype=2&sit=all&score=all&stdoi=std&rate=y&team=ALL&pos=S&loc=B&toi=0.1&gpfilt=none&fd=&td=&tgp=410&lines=single")

links = driver.find_elements_by_css_selector('table.indreg.dataTable.no-footer.DTFC_Cloned [href*=playerid]')
newLinks = []

for link in links:
    newLinks.append(link.get_attribute('href'))

for link in newLinks:
    playerId = getPlayerId(link)
    link = makeNewURL(playerId)
    driver.get(link)
    WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH , '//a[@class="dt-button buttons-csv buttons-html5"][2]')))
    CSVall = driver.find_element_by_xpath('//a[@class="dt-button buttons-csv buttons-html5"][2]')
    CSVall.click()
1 使用 Python 和 Selenium 进行网页抓取时,如何从单个页面获取所有 href 链接?

我正在做我的第一个编程项目。 我目前正在使用 XPATH 方法从网页获取链接,但是,当程序运行时,它返回“[None]”。 不知道为什么会发生这种情况以及如何解决这个问题。 href 链接在 html 代码中是这样实现的: 这是我到目前为止尝试过的代码: ...

2 遍历链接列表并使用Selenium进行抓取

当我尝试遍历链接列表并使用Selenium通过以下代码访问它们时: 我收到此错误: selenium.common.exceptions.WebDriverException:消息:未知错误:未处理的检查器错误:{“代码”:-32603,“消息”:“无法导航到无效 ...

3 使用 Selenium、Python 和 Headless Driver 进行网页抓取

我正在使用 Selenium、Python 和无头 Web 驱动程序从网站上抓取网页。 看来我的 get 请求被阻止了,因为它返回错误,说请求不成功,并且错误消息与 ROBOTS 有关。 我认为该站点正在阻止请求,认为我是机器人,或者是严格的站点策略,是否有任何解决方案? 部分错误信息: 本 ...

4 使用 Selenium 和 Python 进行网页抓取

我是编码初学者,并尝试使用 selenium 学习网页抓取,我一直在做一个项目,用字典检查用每个单词破解密码需要多长时间。 所以我的代码读取一个 .txt 文件,每行都有一个单词,然后将它写入栏,它会复制破解它需要多长时间。 问题是我无法捕获网页的一部分 html 代码,我需要帮助。 这是我的代码 ...

5 使用 Selenium + Python 进行网页抓取

目标是从http://www.weather.gov.sg/climate-historical-daily/抓取历史天气 要获取特定月份的数据,首先必须选择城市名称、月份和年份 有63个城市,12个月,41年 单击显示按钮 如何从这些引导程序下拉列表中选择选项并将天气数据复制到 ...

8 使用 Selenium&gChrome 进行 Python 网页抓取

我正在尝试抓取网页,但无法按类名查找元素。 我可以在 Chrome 的 Elements 面板中看到元素的类名,当输入时,如下所示,它返回一个空结果。 我正在尝试使用这个排行榜页面来至少抓取用户名和他们的分数,进一步的计划是还要记下他们的位置并将其输入到 Excel 电子表格中,但那是将来的事情 ...

10 使用python中的beautifulsoup和selenium在Google Scholar中进行网页抓取

我正在尝试从 Google Scholar 个人资料中抓取。 我需要具有我指定的特殊规格的配置文件。 我在 Python 中使用 Beautifulsoup 和 selenium。 例如,我需要一所大学的教授来研究我指定的某些学科。 你的想法是什么? 我的方式很慢,需要访问每个个人资料页面来检查我 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM