【问题标题】:Able to Web Scrape Static but not Dynamic Sites能够抓取静态网站但不能抓取动态网站
【发布时间】:2020-10-02 15:25:51
【问题描述】:

我正在尝试从 ESPN 获取下一场即将到来的比赛的时间,您可以在 ESPN 上找到:https://www.espn.com/(现在似乎是尤文图斯和 AC 米兰之间的足球比赛)

我的 webscrape 有以下 python 代码:

import requests
from lxml import html
from selenium import webdriver
import chromedriver_binary

driver = webdriver.Chrome()
driver.get('https://www.espn.com/')

tree = html.fromstring(driver.page_source)

time = tree.xpath('//*[@id="news-feed"]/section[1]/header/a/div[2]/span[2]/span')

print(time)

但它返回此错误:

Traceback (most recent call last):
  File "c:\Users\akash\Coding\test\scrape.py", line 9, in <module>
    tree = html.fromstring(driver.page_source)
  File "C:\Users\akash\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 679, in page_source
    return self.execute(Command.GET_PAGE_SOURCE)['value']
  File "C:\Users\akash\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\akash\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchWindowException: Message: no such window: target window already closed
from unknown error: web view not found
  (Session info: chrome=83.0.4103.97)

我怀疑问题是因为这是 ESPN 网站上的动态内容,因为我能够使用相同的代码(除了更改 URL 和 XPath)从另一个具有恒定数据的网站上抓取数据。谁能帮忙解决这个错误?

我已经在代码中安装了每个 python 库。 (注:我已经看过Scraping using python and xpathPython Selenium Chrome Webdriver

【问题讨论】:

  • 您到底想从网站上抓取什么?由于我2天后在看这个,显然内容已经改变了,所以我不知道你到底要拉什么
  • 由于内容发生了变化,我一直在尝试从不同的网站上抓取。检查下面答案中的 cmets 以查看我与 Dmitry 的讨论。

标签: python selenium selenium-webdriver web-scraping


【解决方案1】:

就我而言,我使用了从chromium.org 下载的二进制文件。代码如下:

from lxml import html
from selenium import webdriver
from selenium.webdriver.chrome.options import Options  
chrome_options = Options()  
chrome_options.add_argument("--headless") 

driver = webdriver.Chrome(r'./chromedriver', chrome_options=chrome_options)
driver.get('https://www.espn.com/')
tree = html.fromstring(driver.page_source)
time = tree.xpath("//*[@id='news-feed']//span[@class='game-time']/text()")[0].strip()
print(time)

传递给chrome_options--headless 参数是可选的(这只是在其“无头模式”下运行Chrome)。

【讨论】:

  • 您好,感谢您的回答。不幸的是,我仍然遇到了一个问题:link(对于“测试”事物的奇怪交叉表示抱歉)我使用了与您完全相同的代码。我的chromedriver.exe 位于项目文件夹内的chromedriver 文件夹中。
  • 你写了文件的扩展名“.exe”吗?像这样:driver = webdriver.Chrome(r'./chromedriver.exe', chrome_options=chrome_options)
  • 好吧,看到你的评论后我把它改成了driver = webdriver.Chrome(r'./chromedriver/chromedriver.exe', options=chrome_options),但现在只输出[](我改成了ESPN以外的东西,因为即将到来的比赛已经不存在了)。这是动态网站的另一个问题吗?我也试过从另一个网站上抓取,效果很好。
  • 这个也没有问题。您要解析的表数据在 iframe 中,因此首先您应该切换到 iframe:driver.switch_to.frame("cdcCharts3") 然后找到所有标题:table_headers = driver.find_elements_by_xpath('//*[@id="cdc-chart-1-data"]/thead/tr/th'),最后获得标题文本,如:table_headers_text = [h.get_attribute('textContent') for h in table_headers],然后您将获得一组标题数据。然后您可以获取所有表格行数据,但无需再次切换到 iframe,因为您已经进入。但是如果您想解析另一个表格数据,那么您应该切换到另一个框架
  • 1.有很多方法可以做到这一点,但这是另一个讨论的话题。 2. 所有站点的标记都不同,因此一般方式都可以,但您需要单独处理每个站点。请将我的回答标记为有帮助并投票赞成我的评论,因为他们回答了您的所有问题。
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多