【问题标题】:Data Scraping: Webpage doesn't exist unless I load it through the main website数据抓取:除非我通过主网站加载,否则网页不存在
【发布时间】:2020-02-08 16:02:53
【问题描述】:

我正在尝试使用 BeautifulSoup 从多个网页中抓取数据。这些网页中的每一个都具有相同的格式,并在末尾有一个唯一标识它们的代码,例如。 www.sample_000.com。问题是,如果我随机选择一个代码 123 并尝试抓取 www.sample_123.com,我将一无所获,因为该页面不存在。如果我尝试直接从浏览器打开它,我会收到 HTTP 404 错误。但是,如果我去主网站并选择适当的输入值来打开www.sample_123.com,它会加载得很好。

从主网站加载一次后,我现在可以在浏览器中独立抓取并打开它,而无需通过主网站。这是怎么回事?如何在不先通过主网站打开这些网页的情况下抓取这些网页?

更新:我尝试使用 Selenium 在抓取之前使用相应的输入加载每个网页。它现在可以工作,但是速度非常慢。如果有人推荐一种更快的方法,将不胜感激。

【问题讨论】:

  • 您是否尝试过将 selenium 与 chromedriver 一起使用?
  • @qbbq 是解决这个问题的唯一方法吗?我从未使用过硒,但似乎很乏味。我必须抓取数千个这样的网页,每个网页都有不同的代码。
  • 其他人可能有更优雅的方式,但我使用了很多 selenium,并且喜欢它处理页面脚本的方式(这听起来像你的网站正在使用的方式)。一旦你开始,它就不会那么乏味了。要打开网站,您可以使用以下代码:chrome_path = r"path_to_chromedriver.exe" driver = webdriver.Chrome(chrome_path) driver.implicitly_wait(1) driver.maximize_window() link = "www.test.com/blah" driver.get(link) 在不了解您的网站的情况下,我不知道您需要的选项(分页、单击链接等)。恕我直言 selenium 可以很好地处理脚本。
  • 我会测试一下,谢谢!
  • 你介意分享网址吗?

标签: python web-scraping beautifulsoup screen-scraping


【解决方案1】:

一旦你得到https://mnregaweb2.nic.in/netnrega/writereaddata/state_out/jobcardreg_1719004041_local.html抓取很容易使用requestsscrapy 任何其他网络请求包。 但是从主网站获取 url 列表有点棘手。主网https://mnregaweb2.nic.in/netnrega/loginframegp.aspx?page=C&state_code=17 实际上是用数据库运行的。每次您选择一个选项时,您实际上是在向服务器发布一个 http 请求。然后服务器返回一个响应,该响应由浏览器上的 javascript 引擎进一步解释。因此,为什么您不能简单地 scrape 将 html 作为 _local.html 的 url 实际上并不存在于主窗口中。您必须通过单击继续按钮来一一呈现它们。

如果子网站数量有限,我建议手动收集列表。如果您只考虑自动化,请使用 selenium,但要花费大量时间进行测试和调试。

【讨论】:

    【解决方案2】:

    试试这段代码,只需更改 chromedriver 的位置:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import WebDriverException
    
    chrome_path = r"path_to_chromedriver"
    driver = webdriver.Chrome(chrome_path)
    driver.implicitly_wait(1)
    driver.maximize_window()
    
    link = "https://mnregaweb2.nic.in/netnrega/writereaddata/state_out/jobcardreg_1719004041_local.html"
    
    driver.get(link)
    

    【讨论】:

      猜你喜欢
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多