首页 > 编程问答 >如何在 Python 中加载站点的所有资源,包括 AJAX 请求等?

如何在 Python 中加载站点的所有资源,包括 AJAX 请求等?

时间:2024-07-27 06:57:47浏览次数:9  
标签:python selenium beautifulsoup urllib2 python-requests

我知道如何使用 Python 请求网站并读取其文本。过去,我曾尝试使用像 BeautifulSoup 这样的库来发出对网站上链接的所有请求,但这并没有得到看起来不像完整 URL 的内容,例如 AJAX 请求和大多数对原始域(因为“ http://example.com ”将丢失,更重要的是,它不是 <a href='url'>Link</a> 格式,所以BeautifulSoup将丢失它)。

如何我用 Python 加载网站的所有资源?它是否需要与 Selenium 之类的东西进行交互,或者是否有一种方法在没有它的情况下也不太难实现?我没怎么用过 Selenium,所以我不确定这会有多困难。

谢谢


是的,你需要像 Selenium 这样能够渲染网页并执行 JavaScript 的工具。标准的 HTTP 库,比如 requests ,只获取初始的 HTML 文档,不会执行 JavaScript 代码,所以你无法获取通过 AJAX 动态加载的内容。

以下是使用 Selenium 获取网站所有资源的基本步骤:

1. 安装 Selenium 和 WebDriver:

pip install selenium

你还需要下载与你的浏览器版本匹配的 WebDriver。例如,如果你使用 Chrome,你需要下载 ChromeDriver。你可以从这里下载: https://chromedriver.chromium.org/downloads

2. 编写 Python 代码:

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

# 指定 WebDriver 的路径
driver_path = '/path/to/your/chromedriver'  # 请替换为你的 ChromeDriver 路径

# 初始化 WebDriver
driver = webdriver.Chrome(executable_path=driver_path)

# 打开目标网页
driver.get('https://www.example.com')

# 等待页面加载完成 (可选,但建议)
# 例如,等待某个元素出现
wait = WebDriverWait(driver, 10)  # 最多等待 10 秒
element = wait.until(EC.presence_of_element_located((By.ID, 'some-element-id')))

# 获取所有资源链接 (包括 AJAX 加载的)
resources = []
for script in driver.find_elements(By.TAG_NAME, 'script'):
    src = script.get_attribute('src')
    if src:
        resources.append(src)

for link in driver.find_elements(By.TAG_NAME, 'link'):
    href = link.get_attribute('href')
    if href:
        resources.append(href)

for img in driver.find_elements(By.TAG_NAME, 'img'):
    src = img.get_attribute('src')
    if src:
        resources.append(src)

# ... 可以添加更多标签,例如 'video', 'audio' 等等

# 打印所有资源链接
for resource in resources:
    print(resource)

# 关闭浏览器
driver.quit()

这段代码会:

  1. 初始化 Selenium WebDriver 并打开目标网页。
  2. 等待页面加载完成 (可选,但建议)。
  3. 找到所有 <script> , <link> , <img> 标签 并获取它们的 src href 属性,这些属性通常指向资源文件。
  4. 打印所有资源链接

你可以根据需要修改这段代码,例如添加更多标签来获取其他类型的资源,或者使用 requests 库下载这些资源。

注意:

  • 使用 Selenium 会比使用 requests 库慢很多,因为它需要打开浏览器窗口并渲染整个页面。
  • 一些网站可能会阻止 Selenium 访问,所以你需要采取一些措施来避免被检测到,例如设置 User-Agent。

希望这些信息能帮到你!

标签:python,selenium,beautifulsoup,urllib2,python-requests
From: 25233595

相关文章

  • 使用Python进行PDF旋转
    使用python旋转扫描的pdf后,它工作得很好,但将pdf发送给第三方后,第三方仍然将pdf检测为90度pdf有什么办法可以解决旋转和这个问题importPyPDF2withopen('input.pdf','rb')asfile:#CreateaPDFreaderobjectreader=PyPDF2.PdfReader(file)......
  • Python win32serviceutil QueryServiceStatus:返回值是什么意思?
    我正在学习使用pywin32,并尝试在64位Python3.6.4上使用win32serviceutil模块以下代码:importwin32serviceutilasserviceserviceStatus=service.QueryServiceStatus("WinDefend")print(serviceStatus)返回以下元组:(16,4,197,0,0,0,0)我对wind......
  • Python request-html 未下载 Chromium
    importrequestsfrombs4importBeautifulSoupfromrequests_htmlimportHTMLSessionurl="https://dmarket.com/ingame-items/item-list/csgo-skins?title=recoil%20case"sesion=HTMLSession()response=sesion.get(url)response.html.render()soup=B......
  • VS Code 不改变 python 环境
    我正在使用VS-Code和anaconda环境作为python解释器。我通过ctrl+shift+`选择准确的anaconda基础环境,它也反映在vscode的下侧面板中。但是,当我检查python版本时,它显示我系统的默认python环境3.7.9如果您看到下面的截图,anaconda环境是3.......
  • 使用 Python 打开保存为 Parquet 文件中元数据的 R data.table
    使用R,我创建了一个Parquet文件,其中包含一个data.table作为主要数据,另一个data.table作为元数据。library(data.table)library(arrow)dt=data.table(x=c(1,2,3),y=c("a","b","c"))dt2=data.table(a=22222,b=45555)attr(dt,&......
  • Python 需要 Windows 长路径
    我尝试运行此安装:pip3installmsgraph-sdk它给了我这个错误:它说我需要使用此链接启用Windows长路径:https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-versi......
  • 使用 Selenium 时的 WebDriver 错误错误:OSError: [WinError 193] %1 不是有效的 Win32
    我正在使用文档中的代码:https://pypi.org/project/webdriver-manager/#use-with-chrome安装并升级所有软件包并运行下面的代码后:fromseleniumimportwebdriverfromselenium.webdriver.chrome.serviceimportServiceasChromeServicefromwebdriver_manager.......
  • Python griddata() 和 Matlab griddata():某些网格点的结果不同
    在将一些(相当大的物理)Matlab代码转换为Python时,我偶然发现了这种情况。当对相同的二维离散数据进行插值时,Python/Scipy的griddata()函数给出的结果与Matlab的对应函数不同。griddata()Matlab示例代码:Python示例代码:%Samplepoints(x,y):7x5=3......
  • Ebay Python SDK 仅在特定项目类别上返回错误
    我在一个项目中使用ebaySDK一段时间了。最近我尝试导入一些商品,例如手表、手机壳等...并且我使用了eBay自己通过eBay返回的英国商店页面上的类别ID他们的“get_category_suggestions”API端点,但eBay似乎有选择地决定拒绝某些项目并引发服务器错误!为了测试,我做了......
  • 使用特定的Python版本(MacOS)制作virtualenv
    我安装了brew,python3(默认和最新版本)和pip3,pyenv。TensorFlow现在不支持python3.7,所以我听说我应该制作一个独立运行3.6或更低版本的virtualenv。我安装了python3.6.7bypyenvinstall3.6.7但无法制作virtualenv-p3.6.7(mydir)因为3.6.7不在P......