使用 Python 和ProxyScrape API 抓取静态和动态网站

指南, 蟒蛇, 差异, May-02-20245 分钟阅读

在这个越来越依赖数据的世界里,收集和分析大量信息的能力可以为企业和专业人士带来巨大的竞争优势。从网站中提取数据的过程--网络搜索,是数据分析师、网络开发人员、数字营销人员和 Python 程序员的有力工具。本指南将带您了解基本和高级网络抓取技术,重点介绍最佳实践,并介绍ProxyScrape 的 网络抓取 API,作为静态和动态网站的灵活解决方案。

识别网站是静态的还是动态的

确定网站是静态的还是动态的:

  • 检查页面源:右键单击并选择 "查看页面源"。如果所有内容都可见,且与页面上显示的内容一致,则很可能是静态内容。
  • 使用浏览器开发工具:右键单击页面并选择 "检查",打开开发工具,然后在与页面交互时查看 "网络 "选项卡。如果新的网络请求是针对交互而发出的,那么这很可能是一个动态网站。
  • 禁用 JavaScript:尝试在浏览器设置中禁用 JavaScript,然后重新加载页面。如果页面停止正常运行或显示的内容很少,则很可能是依靠 JavaScript 来获取和呈现数据,这表明页面具有动态性质。

这些方法只是确定网站是静态还是动态的几种方法。虽然还有其他策略,但我们已经分析并确定了这些技术,我们认为这些技术被广泛使用且行之有效。

使用 Requests 和 BeautifulSoup 搜索静态网站

为了抓取静态内容,Python 提供了强大的库,如用于发出 HTTP 请求的 `requests` 库和用于解析 HTML 和 XML 文档的 `BeautifulSoup` 库。下面是一个简单的例子:

  • 提出请求:使用 `requests` 获取页面的 HTML 内容。
  • 使用 BeautifulSoup 进行解析:获得页面内容后,`BeautifulSoup` 可以解析并提取特定信息。
导入请求
bs4导入BeautifulSoup

response = requests.get('http://example.com')

soup = BeautifulSoup(response.text,'html.parser')

# 提取所需的数据
data = soup.find_all('p')

这种方法非常适合刚刚开始网络搜刮之旅的人。它对静态内容的网站很有效,只需最少的设置。

扫描动态网站

动态网站面临着不同的挑战。这些网站使用 JavaScript 异步加载内容,这意味着直接的 HTML 搜刮无法工作,因为数据并不存在于初始页面加载中。

动态网站搜索有两种方法:

  • 第一种方法是使用 Playwright/Selenium 等浏览器自动化库获取内容,然后用 Beautifulsoup 进行解析。
  • 第二种方法就像在网络选项卡上玩侦探游戏,找出网站用来获取数据的端点。然后,你只需使用 Python 的 "request "模块自行抓取数据。

使用 Playwright 浏览动态网站

要抓取动态内容, Playwright等工具可以模拟真实用户与浏览器的交互,让您抓取动态加载的数据。下面简要介绍如何使用 Playwright 和 Python:

  • 安装 Playwright:安装 Playwright 软件包和命令行工具。
    - "pip install playwright"
    - "playwright install"
  • 使用 Playwright 模拟交互:编写一个脚本,导航网站并与之进行必要的交互,以触发动态内容的加载
从 playwright.sync_api 导入 sync_playwright


如果 __name__ =='__main__':

   with sync_playwright() as p:

       browser = p.chromium.launch(headless=True)

      page= browser.new_page()

      page.goto('https://www.scrapethissite.com/pages/ajax-javascript/')

      # 在此模拟交互

      page.click('//*[@id="2014"]')

      # 提取动态内容

       content =page.inner_text('//*[@id="oscars"]/div/div[5]/div/table')

      print(content)

       browser.close()

分析网络面板以获取 API 端点:

  • 打开开发工具
    a. 在浏览器中打开您感兴趣的网站。
    b. 右键单击页面上的任意位置,选择 "检查 "或按 Ctrl+Shift+I (Mac 上为 Cmd+Option+I),打开开发工具。
  • 检查网络选项卡
    a. 点击开发工具中的网络选项卡。
    b. 刷新页面,从头开始捕获流量。
  • 过滤和识别 AJAX 请求
    a. 可以按 AJAX 请求常用的 XHR(XMLHttpRequest)等类型过滤请求。
    b. 与页面交互,如点击按钮、填写表格或滚动,以触发内容的动态加载。
    c. 观察执行这些操作时出现的网络请求。查找获取你感兴趣的数据的请求。
  • 分析请求
    a. 在 "网络 "选项卡中单击一个看起来正在检索所需数据的请求。
    b. 检查 "标头 "部分,查看请求方法(GET、POST 等)、URL 和其他标头。
  • 使用 Python 复制请求
    a. 使用标题选项卡中的信息,使用 Python 的请求库复制请求。下面是一个基本示例,说明如何进行复制:
import requests

# URL from the AJAX request
url = 'https://example.com/api/data'

# Any headers you observed that are necessary, like user-agent, authorization tokens, etc.
headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36,gzip(gfe)',
    'Authorization': 'Bearer token_if_needed'
}

# If it's a POST request, you might also need to send data
data = {
    'example_key': 'example_value'
}

# Replace 'get' with 'post' if the request type is POST
response = requests.get(url, headers=headers, data=data if 'post' in locals() else None)

# To view the response
print(response.json()) 

在两种情况下都使用网络抓取 API

虽然掌握请求和 Playwright 或任何其他 Http 客户端库都会让人受益匪浅,但要正确处理它们却需要花费时间和精力。另一种方法是利用 Web Scraping API,它可以将复杂的刮擦任务抽象化。它不仅能为你处理 HTTP 请求的发送,还能提供反禁止技术的帮助,防止被某些网站屏蔽。

ProxyScrape 网络抓取应用程序接口介绍

ProxyScrape提供的 网络抓取 API可简化静态和动态网站的数据提取。

应用程序接口的功能包括

  • 与动态和静态网站轻松集成。
  • 全面支持不同类型的网络搜索活动。
  • 广泛的 IP 地址库
  • 提供多达 100,000 次免费请求,使用户无需立即投资就能探索和实现 API 的全部潜力。
  • 先进的反禁用技术,专为以刮擦困难著称的网站量身定制。
  • 操作可对接收网站输出的时间进行精确控制。这包括等待特定的 URL 请求、预测网站上出现的元素、滚动后活动等。利用

ProxyScrape 使用静态网站的网络抓取 API:

这是一个示例,说明如何将我们的网络刮擦 API 集成到用于静态网站的 Python 脚本中,或用于调用从浏览器检查面板中提取的 API 端点:

import requests
import base64
import json

data = {
    "url": "https://books.toscrape.com/",
    "httpResponseBody": True
}

headers = {
    'Content-Type': 'application/json',
    'X-Api-Key': 'YOUR_API_KEY'
}

response = requests.post('https://api.proxyscrape.com/v3/accounts/freebies/scraperapi/request', headers=headers, json=data)

if response.status_code == 200:
    json_response = response.json()
    if 'browserHtml' in json_response['data']:
        print(json_response['data']['browserHtml'])
    else:
        print(base64.b64decode(json_response['data']['httpResponseBody']).decode())
else:
    print("Error:", response.status_code)

ProxyScrape 带有动态网站的 Web Scraping API:

下面是一个等待 favicon 开始加载的示例。在我们使用的测试网站上,这通常是最后一个启动的请求。

import requests
import json

url = 'https://api.proxyscrape.com/v3/accounts/freebies/scraperapi/request'

headers = {
    'Content-Type': 'application/json',
    'X-Api-Key': '<your api key>'  # Make sure to replace <your api key> with your actual API key
}

payload = {
    "url": "https://books.toscrape.com/",
    "browserHtml": True,
    "actions": [
        {
            "action": "waitForRequest",
            "urlPattern": "https://books.toscrape.com/static/oscar/favicon.ico",
            "urlMatchingOptions": "exact"
        }
    ]
}

response = requests.post(url, headers=headers, json=payload)

# Print the response from the server
print(response.text)  # Prints the response body as text

网络抓取最佳实践

无论您选择何种工具或 API,遵守网站使用条款、限制请求率以避免 IP 禁止以及使用代理进行匿名搜刮都是至关重要的最佳实践。 ProxyScrape我们不仅提供满足此类需求的高级、住宅、移动和专用代理,还鼓励合乎道德的网络搜刮。

结论

  • 无论您是将网络搜刮作为业余爱好,还是将其纳入您的专业工具包,了解静态网站和动态网站之间的区别以及如何有效地搜刮这两种网站都是至关重要的。通过将 Requests、Playwright/Selenium 等 Python 库与 Beautifulsoup 结合使用,您就能应对网络刮擦的挑战。
  • 如果您的网络抓取脚本被检测为僵尸并随后被阻止,或者如果您希望优化和简化请求发送流程,请考虑使用我们的网络抓取 API。它旨在代表您有效管理这些问题。
  • 请记住,网络搜刮的未来是光明的,只要坚持最佳实践并利用最先进的工具,就能开启一个等待被发现的数据世界。

准备好开始您的网络搜索之旅了吗?今天就 注册ProxyScrape,利用我们的专用代理、住宅代理和全面的 Web Scraping API 探索网络的无限可能。