数据抓取:网页不存在,除非我通过主网站加载它

Data Scraping: Webpage doesn't exist unless I load it through the main website

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

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

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

尝试此代码,只需更改您的 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)

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

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