在电脑或Android手机上实现自动化爬虫规避风控反爬,掌握 ScrapeGraphAI:让AI帮你实现数据爬虫自动化,自动执行 Chromium、Firefox、WebKit 等主流浏览器自动化操作。
ScrapeGraphAI 是一个功能强大的 Python 库,旨在简化从网站、文档和 XML 文件中提取信息的过程。利用大型语言模型(LLM)和直接图逻辑,ScrapeGraphAI 可以创建高效的抓取管道。无论您是需要从复杂的网站中提取数据,还是需要处理文档和 XML 文件,这个库都能为您提供便捷的解决方案。以下是 ScrapeGraphAI 的详细介绍和使用示例。
快速安装
ScrapeGraphAI 的参考页面可在 pypy 的官方网站上找到:pypi。
pip install scrapegraphai
您还需要安装 Playwright 以进行基于 JavaScript 的抓取:
playwright install
`
Playwright 是一个强大的 Python 库,仅用一个 API 即可自动执行 Chromium、Firefox、WebKit 等主流浏览器自动化操作。
Playwright 是由微软开发的一款强大的开源自动化测试工具,主要用于端到端(End-to-End)测试、网页爬虫、自动化任务等。它支持多种浏览器(包括 Chromium、Firefox 和 WebKit),并且能够在多种操作系统(Windows、macOS、Linux)上运行。Playwright 提供了丰富的 API,使得编写稳定、可靠的自动化脚本变得更加简便。
以下是关于 Playwright 的详细介绍,包括安装、基本用法、高级功能和最佳实践等内容。
1. 什么是 Playwright?
Playwright 是一个用于浏览器自动化的开源库,支持多种编程语言(如 JavaScript、TypeScript、Python、C# 和 Java)。它由微软维护,旨在为开发者提供一个现代化、跨浏览器的自动化测试解决方案。Playwright 的主要特点包括:
- 多浏览器支持:支持 Chromium(Chrome、Edge)、Firefox 和 WebKit(Safari)。
- 跨平台:支持在 Windows、macOS 和 Linux 上运行。
- 并行测试:内置的并行执行能力,提高测试效率。
- 自动等待:自动处理元素的等待,减少不必要的显式等待代码。
- 强大的选择器:支持 CSS 选择器、XPath 选择器以及 Playwright 独有的选择器引擎。
2. 安装 Playwright
2.1 使用 Node.js 安装(推荐)
Playwright 最常用于 JavaScript 和 TypeScript 环境中,以下是在 Node.js 环境中安装 Playwright 的步骤:
-
安装 Node.js:确保你的系统已经安装了 Node.js。可以通过以下命令检查:
node -v npm -v
如果没有安装,可以从 Node.js 官方网站 下载并安装。
-
初始化项目:
mkdir playwright-demo cd playwright-demo npm init -y
-
安装 Playwright:
npm install --save-dev playwright
这将安装 Playwright 及其相关依赖。
-
下载浏览器二进制文件:
Playwright 会自动下载所需的浏览器二进制文件。如果需要手动下载,可以运行:npx playwright install
2.2 使用其他语言
Playwright 还支持 Python、C# 和 Java 等语言。以下以 Python 为例:
-
安装 Python:确保系统已安装 Python 3.7 以上版本。
-
创建虚拟环境并激活:
python -m venv venv source venv/bin/activate # Linux/macOS venv\Scripts\activate # Windows
-
安装 Playwright:
pip install playwright
-
下载浏览器二进制文件:
playwright install
3. 基本用法
以下以 JavaScript 为例,介绍 Playwright 的基本用法。
3.1 启动浏览器并打开页面
const { chromium } = require('playwright');
(async () => {
// 启动 Chromium 浏览器
const browser = await chromium.launch({ headless: false }); // headless: false 表示有界面
// 创建一个新的浏览器上下文
const context = await browser.newContext();
// 创建一个新的页面
const page = await context.newPage();
// 导航到目标网址
await page.goto('https://www.example.com');
// 截图
await page.screenshot({ path: 'example.png' });
// 关闭浏览器
await browser.close();
})();
3.2 元素选择与交互
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://www.google.com');
// 输入搜索关键词
await page.fill('input[name="q"]', 'Playwright');
// 提交搜索
await page.press('input[name="q"]', 'Enter');
// 等待搜索结果加载
await page.waitForSelector('text=Playwright');
// 获取第一个搜索结果的文本
const firstResult = await page.textContent('h3');
console.log(`第一个搜索结果: ${firstResult}`);
await browser.close();
})();
3.3 处理多页面和弹窗
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
// 监听新页面(例如弹窗)
context.on('page', async newPage => {
console.log('新页面已打开');
await newPage.screenshot({ path: 'popup.png' });
});
await page.goto('https://www.example.com');
// 假设点击按钮会打开新页面
await page.click('button#open-popup');
await browser.close();
})();
4. 高级功能
4.1 选择器
Playwright 支持多种选择器,包括 CSS 选择器、XPath 选择器以及 Playwright 特有的选择器(如 text=...
、role=...
等)。
// 使用 CSS 选择器
await page.click('button.submit');
// 使用 XPath 选择器
await page.click('//button[text()="Submit"]');
// 使用文本选择器
await page.click('text=Submit');
// 使用角色选择器
await page.click('role=button[name="Submit"]');
4.2 截图与视频录制
Playwright 可以截取页面的截图,或者录制测试过程中的视频。
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext({
recordVideo: { dir: 'videos/' } // 指定视频保存目录
});
const page = await context.newPage();
await page.goto('https://www.example.com');
await page.screenshot({ path: 'screenshot.png' });
await page.click('button#submit');
await browser.close();
// 视频文件会保存在 'videos/' 目录中
})();
4.3 网络拦截与模拟
Playwright 允许拦截网络请求,并进行模拟响应。
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
// 拦截所有网络请求
await page.route('**/*', route => {
const url = route.request().url();
if (url.endsWith('.png')) {
// 阻止加载图片
route.abort();
} else {
route.continue();
}
});
await page.goto('https://www.example.com');
await browser.close();
})();
4.4 多浏览器测试
Playwright 支持 Chromium、Firefox 和 WebKit,能够轻松进行跨浏览器测试。
const { chromium, firefox, webkit } = require('playwright');
(async () => {
for (const browserType of [chromium, firefox, webkit]) {
const browser = await browserType.launch();
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://www.example.com');
await page.screenshot({ path: `example-${browserType.name()}.png` });
await browser.close();
}
})();
4.5 并行测试
Playwright 支持并行执行多个测试,提高测试效率。可以结合测试框架(如 Jest、Mocha 或 Playwright 自带的测试库)实现。
使用 Playwright Test 框架
Playwright 提供了自己的测试框架,称为 Playwright Test,内置了并行执行、报告生成等功能。
-
安装 Playwright Test:
npm install --save-dev @playwright/test
-
编写测试用例(例如
example.spec.js
):const { test, expect } = require('@playwright/test'); test('Google 搜索 Playwright', async ({ page }) => { await page.goto('https://www.google.com'); await page.fill('input[name="q"]', 'Playwright'); await page.press('input[name="q"]', 'Enter'); await expect(page).toHaveTitle(/Playwright/); });
-
运行测试:
npx playwright test
Playwright Test 会自动并行执行测试用例,并生成测试报告。
5. 最佳实践
5.1 使用 Page Object 模式
为了提高测试代码的可维护性和可读性,建议使用 Page Object 模式,将页面元素和操作封装在独立的类中。
// pageObjects/loginPage.js
class LoginPage {
/**
* @param {import('@playwright/test').Page} page
*/
constructor(page) {
this.page = page;
this.usernameInput = 'input#username';
this.passwordInput = 'input#password';
this.submitButton = 'button#submit';
}
async login(username, password) {
await this.page.fill(this.usernameInput, username);
await this.page.fill(this.passwordInput, password);
await this.page.click(this.submitButton);
}
}
module.exports = { LoginPage };
// tests/login.spec.js
const { test, expect } = require('@playwright/test');
const { LoginPage } = require('../pageObjects/loginPage');
test('用户登录', async ({ page }) => {
const loginPage = new LoginPage(page);
await page.goto('https://www.example.com/login');
await loginPage.login('testuser', 'password123');
await expect(page).toHaveURL('https://www.example.com/dashboard');
});
5.2 管理测试数据
将测试数据与测试逻辑分离,使用配置文件或数据驱动的方式管理测试数据,提高测试的灵活性。
// data/users.json
{
"validUser": {
"username": "testuser",
"password": "password123"
},
"invalidUser": {
"username": "invalid",
"password": "wrongpassword"
}
}
// tests/login.spec.js
const { test, expect } = require('@playwright/test');
const { LoginPage } = require('../pageObjects/loginPage');
const users = require('../data/users.json');
test('有效用户登录', async ({ page }) => {
const loginPage = new LoginPage(page);
await page.goto('https://www.example.com/login');
await loginPage.login(users.validUser.username, users.validUser.password);
await expect(page).toHaveURL('https://www.example.com/dashboard');
});
test('无效用户登录', async ({ page }) => {
const loginPage = new LoginPage(page);
await page.goto('https://www.example.com/login');
await loginPage.login(users.invalidUser.username, users.invalidUser.password);
await expect(page.locator('.error')).toBeVisible();
});
5.3 使用环境变量管理敏感信息
避免在代码中硬编码敏感信息(如用户名、密码),使用环境变量或安全的配置管理工具。
// 使用 dotenv 加载环境变量
require('dotenv').config();
const username = process.env.USERNAME;
const password = process.env.PASSWORD;
在项目根目录创建 .env
文件:
USERNAME=testuser
PASSWORD=password123
5.4 并行化与资源管理
合理配置测试并行数,避免因资源不足导致测试不稳定。可以在 Playwright Test 配置文件中设置并行数。
// playwright.config.js
module.exports = {
retries: 2,
workers: 4, // 设置并行执行的测试数量
use: {
headless: true,
viewport: { width: 1280, height: 720 },
actionTimeout: 5000,
ignoreHTTPSErrors: true,
},
};
6. Playwright 与其他工具的集成
6.1 集成持续集成(CI)系统
Playwright 可以与多种 CI 系统(如 GitHub Actions、Jenkins、GitLab CI)集成,自动化执行测试。
示例:GitHub Actions
创建 .github/workflows/playwright.yml
文件:
name: Playwright Tests
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14, 16, 18]
steps:
- uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npx playwright install
- run: npx playwright test
6.2 报告与分析
Playwright Test 自带详细的测试报告,可以生成 HTML 报告、JUnit 报告等,便于分析测试结果。
npx playwright test --reporter=html
生成的报告可以通过浏览器查看,提供了详细的测试执行情况和截图。
7. 资源与社区
7.1 官方文档
7.2 示例项目
7.3 社区与支持
7.4 教程与课程
Playwright 是一个功能强大且灵活的浏览器自动化工具,适用于各种自动化测试场景。其跨浏览器、跨平台的特性,使得它在现代 Web 开发和测试中扮演着重要角色。通过掌握 Playwright 的基本用法和高级功能,开发者和测试人员可以编写高效、稳定的自动化测试脚本,提高开发和测试的效率与质量。
用法
您可以使用 SmartScraper 类通过提示从网站提取信息。
SmartScraper 类是一个直接图实现,使用了 Web 抓取管道中最常见的节点。有关更多信息,请参阅文档。
示例 1:使用 Ollama 提取信息 记得单独下载 Ollama 模型!
from scrapegraphai.graphs import SmartScraperGraph
graph_config = {
"llm": {
"model": "ollama/mistral",
"temperature": 0,
"format": "json", # Ollama 需要显式指定格式
"base_url": "http://localhost:11434", # 设置 Ollama URL
},
"embeddings": {
"model": "ollama/nomic-embed-text",
"base_url": "http://localhost:11434", # 设置 Ollama URL
}
}
smart_scraper_graph = SmartScraperGraph(
prompt="列出所有文章",
source="https://perinim.github.io/projects", # 也接受已下载的 HTML 代码字符串
config=graph_config
)
result = smart_scraper_graph.run()
print(result)
示例 2:使用 Docker 提取信息 注意:在使用本地模型之前,请记得创建 Docker 容器!
docker-compose up -d
docker exec -it ollama ollama pull stablelm-zephyr
您可以使用 Ollama 上的可用模型或您自己的模型代替 stablelm-zephyr。
from scrapegraphai.graphs import SmartScraperGraph
graph_config = {
"llm": {
"model": "ollama/mistral",
"temperature": 0,
"format": "json", # Ollama 需要显式指定格式
},
}
smart_scraper_graph = SmartScraperGraph(
prompt="列出所有文章",
source="https://perinim.github.io/projects", # 也接受已下载的 HTML 代码字符串
config=graph_config
)
result = smart_scraper_graph.run()
print(result)
示例 3:使用 OpenAI 模型提取信息
from scrapegraphai.graphs import SmartScraperGraph
OPENAI_API_KEY = "YOUR_API_KEY"
graph_config = {
"llm": {
"api_key": OPENAI_API_KEY,
"model": "gpt-3.5-turbo",
},
}
smart_scraper_graph = SmartScraperGraph(
prompt="列出所有文章",
source="https://perinim.github.io/projects", # 也接受已下载的 HTML 代码字符串
config=graph_config
)
result = smart_scraper_graph.run()
print(result)
示例 4:使用 Groq 提取信息
from scrapegraphai.graphs import SmartScraperGraph
from scrapegraphai.utils import prettify_exec_info
groq_key = os.getenv("GROQ_APIKEY")
graph_config = {
"llm": {
"model": "groq/gemma-7b-it",
"api_key": groq_key,
"temperature": 0
},
"embeddings": {
"model": "ollama/nomic-embed-text",
"temperature": 0,
"base_url": "http://localhost:11434",
},
"headless": False
}
smart_scraper_graph = SmartScraperGraph(
prompt="列出所有项目及其描述和作者。",
source="https://perinim.github.io/projects",
config=graph_config
)
result = smart_scraper_graph.run()
print(result)
示例 5:使用 Azure 提取信息
from langchain_openai import AzureChatOpenAI
from langchain_openai import AzureOpenAIEmbeddings
lm_model_instance = AzureChatOpenAI(
openai_api_version=os.environ["AZURE_OPENAI_API_VERSION"],
azure_deployment=os.environ["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"]
)
embedder_model_instance = AzureOpenAIEmbeddings(
azure_deployment=os.environ["AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME"],
openai_api_version=os.environ["AZURE_OPENAI_API_VERSION"],
)
graph_config = {
"llm": {"model_instance": lm_model_instance},
"embeddings": {"model_instance": embedder_model_instance}
}
smart_scraper_graph = SmartScraperGraph(
prompt="""列出所有事件,包含以下字段:company_name, event_name, event_start_date, event_start_time,
event_end_date, event_end_time, location, event_mode, event_category,
third_party_redirect, no_of_days,
time_in_hours, hosted_or_attending, refreshments_type,
registration_available, registration_link""",
source="https://www.hmhco.com/event",
config=graph_config
)
示例 6:使用 Gemini 提取信息
from scrapegraphai.graphs import SmartScraperGraph
GOOGLE_APIKEY = "YOUR_API_KEY"
# 定义图的配置
graph_config = {
"llm": {
"api_key": GOOGLE_APIKEY,
"model": "gemini-pro",
},
}
# 创建 SmartScraperGraph 实例
smart_scraper_graph = SmartScraperGraph(
prompt="列出所有文章",
source="https://perinim.github.io/projects",
config=graph_config
)
result = smart_scraper_graph.run()
print(result)
所有示例的输出将是一个包含提取信息的字典,例如:
{
'titles': [
'旋转钟摆 RL'
],
'descriptions': [
'开源项目,旨在使用 RL 算法控制现实生活中的旋转钟摆'
]
}
参考:https://github.com/VinciGit00/Scrapegraph-ai?tab=readme-ov-file
在手机上执行自动化爬虫的工具和开源项目虽然相对较少,但仍然有一些有用的选项可以考虑。这些工具大多可以在 Android 设备上运行,并允许用户自动化地抓取网页内容。以下是几个常见的工具和项目的详细介绍:
1. Scrapy + Termux
- 简介: Scrapy 是一个用于抓取 Web 站点并提取结构化数据的 Python 框架。通过安装在 Android 上的 Termux 应用,可以运行一个 Linux 环境,从而安装和运行 Scrapy。
- 使用方法: 在 Termux 中安装 Python 和 Scrapy,然后编写和运行爬虫脚本。Termux 提供了一个接近完整的 Linux 环境,非常适合熟悉 Linux 和命令行操作的用户。
- 访问链接:
2. Katalon Recorder (Mobile)
- 简介: Katalon 是一个强大的自动化测试工具,Katalon Recorder 是其移动版本。虽然主要用于自动化测试,但它也能执行简单的网页抓取任务。它支持录制和回放浏览器上的操作,可以在移动设备上通过 Katalon Studio 进行扩展。
- 功能特点: 支持跨平台操作,能够在移动设备上通过简化的 UI 操作录制和运行爬虫任务。
- 访问链接: Katalon 官网
3. Appium
- 简介: Appium 是一个开源的自动化工具,支持在 Android 和 iOS 设备上进行移动应用的自动化测试。虽然主要用于应用测试,但它也可以用于自动化移动浏览器上的操作,从而实现网页抓取。
- 功能特点: 支持多种编程语言(如 Java、Python 等),允许用户编写复杂的自动化脚本,并能与 Selenium WebDriver 兼容。
- 访问链接: Appium GitHub
4. Selendroid
- 简介: Selendroid 是一个用于 Android 应用自动化的开源工具,类似于 Appium。它支持自动化 Android 应用和移动网页操作,因此可以用于在移动浏览器上执行爬虫任务。
- 功能特点: 支持与 Selenium WebDriver 集成,并能在 Android 设备上直接运行脚本。适合用于测试和网页数据抓取。
- 访问链接: Selendroid 官网
5. Jsoup (With Android)
- 简介: Jsoup 是一个用于解析 HTML 的 Java 库,能够非常方便地在 Android 应用中使用来进行网页数据抓取。
- 使用方法: 在 Android 应用中集成 Jsoup,通过 HTTP 请求获取网页内容,然后使用 Jsoup 解析并提取需要的数据。非常适合构建简单的移动爬虫应用。
- 访问链接: Jsoup 官网
6. Selenium + BrowserStack
- 简介: 虽然 Selenium 通常用于桌面浏览器的自动化操作,但通过集成 BrowserStack 等移动设备云服务,可以在移动设备的浏览器上执行自动化爬虫。
- 功能特点: 通过 BrowserStack 提供的真实设备和模拟器,Selenium 脚本可以在各种移动浏览器上运行,执行网页抓取任务。
- 访问链接:
这些工具和开源项目提供了在移动设备上执行自动化网页抓取的多种方法。选择合适的工具取决于您的需求,例如是否需要操作移动应用、支持的编程语言、以及执行任务的复杂性。