如何抓取网页flash( Node.js和Python的代码片段作引教您如何在Chromium中使用代理)
优采云 发布时间: 2022-04-19 18:39如何抓取网页flash(
Node.js和Python的代码片段作引教您如何在Chromium中使用代理)
剧作家网页抓取教程
近年来,随着互联网行业的发展,互联网的影响力逐渐提升。这也是由于技术水平的提高,开发了越来越多用户体验好的应用。此外,在从 Web 应用程序开发到测试的整个过程中使用自动化正变得越来越普遍。网络爬虫抓取数据的应用也越来越广泛。
拥有有效的工具来测试 Web 应用程序至关重要。像 Playwright 这样的库在浏览器中打开 Web 应用程序,并通过其他交互(例如单击元素、键入文本和从 Web 中提取公共数据)来加速该过程。
本教程介绍了 Playwright 以及如何将其用于自动化甚至网络抓取。
什么是剧作家?
Playwright 是一个自动化 Web 浏览器交互的测试和自动化框架。简而言之,您可以编写打开浏览器的代码,以及适用于所有 Web 浏览器的代码。自动化脚本可以实现导航到 URL、输入文本、单击按钮和提取文本等功能。Playwright 最令人惊讶的特点是它可以同时处理多个页面而无需等待或被阻塞。
Playwright 支持大多数浏览器,例如 Google Chrome、Firefox、带有 Chromium 内核的 Microsoft Edge 和带有 WebKit 内核的 Safari。跨浏览器网络自动化是 Playwright 的强项,可以有效地为所有浏览器执行相同的代码。此外,Playwright 还支持 Node.js、Python、Java 和 .NET 等多种编程语言。您可以编写代码来打开 网站 并使用其中任何一种语言与之交互。
Playwright 的文档非常详细和广泛。它涵盖了从入门到高级的所有课程和方法。
支持剧作家的代理
Playwright 支持使用代理。我们将引导您了解如何在 Chromium 中使用代理,使用以下 Node.js 和 Python 代码片段作为指南:
节点.js:
const { chromium } = require('playwright'); "
const browser = await chromium.launch();
Python:
from playwright.async_api import async_playwright
import asyncio
with async_playwright() as p:
browser = await p.chromium.launch()
上述代码只需稍作修改即可集成代理。使用 Node.js 时,启动函数可以接受 LauchOptions 类型的可选参数。这个 LaunchOption 对象可以发送几个其他参数,例如,headless。另一个需要的参数是代理。这个代理是另一个具有这些属性的对象:服务器、用户名、密码等。第一步是创建一个可以指定这些参数的对象。
// Node.js
const launchOptions = {
proxy: {
server: 123.123.123.123:80'
},
headless: false
}
第二步是将此对象传递给启动函数:
const browser = await chromium.launch(launchOptions);
就 Python 而言,情况略有不同。无需创建 LaunchOptions。相反,所有值都可以作为单独的参数发送。以下是代理字典的发送方式:
# Python
proxy_to_use = {
'server': '123.123.123.123:80'
}
browser = await pw.chromium.launch(proxy=proxy_to_use, headless=False)
在决定使用哪个代理来执行抓取时,最好使用住宅代理,因为它们不会留下任何痕迹,也不会触发任何安全警报。Oxylabs 的住宅代理是一个广泛而稳定的代理网络。您可以通过 Oxylabs 的 Residential Agents 访问国家、省甚至城市的特定站点。最重要的是,您还可以轻松地将 Oxylabs 的代理与 Playwright 集成。
01.用剧作家基本刮
下面我们将描述如何将 Playwright 与 Node.js 和 Python 一起使用。
如果您使用的是 Node.js,则需要创建一个新项目并安装 Playwright 库。可以通过这两个简单的命令来完成:
npm init -y
npm install playwright
打开动态页面的基本脚本如下:
const playwright = require('playwright');
(async () => {
const browser = await playwright.chromium.launch({
headless: false // Show the browser.
});
const page = await browser.newPage();
await page.goto('https://books.toscrape.com/');
await page.waitForTimeout(1000); // wait for 1 seconds
await browser.close();
})();
我们来看看上面的代码。第一行代码导入 Playwright。然后,启动 Chromium 实例。它允许脚本自动化 Chromium。请注意,此脚本将使用可视用户界面运行。成功传递 headless:false 后,会打开一个新的浏览器页面,page.goto 函数将导航到 Books to Scrape 页面。再等待 1 秒以将页面显示给最终用户。最后,浏览器关闭。
同样的代码也很容易用 Python 编写。首先,使用 pip 命令安装 Playwright:
pip install playwright
请注意,Playwright 支持两种模式 - 同步和异步。以下示例使用异步 API:
from playwright.async_api import async_playwright
import asyncio
async def main():
async with async_playwright() as pw:
browser = await pw.chromium.launch(
headless=False # Show the browser
)
page = await browser.new_page()
await page.goto('https://books.toscrape.com/')
# Data Extraction Code Here
await page.wait_for_timeout(1000) # Wait for 1 second
await browser.close()
if __name__ == '__main__':
asyncio.run(main())
此代码类似于 Node.js 代码。最大的不同是使用了 asyncio 库。另一个区别是函数名称从 camelCase 更改为 snake_case。
如果您想创建多个浏览器环境,或者想要更精确的控制,您可以创建一个环境对象并在该环境中创建多个页面。此代码将在新选项卡中打开页面:
const context = await browser.newContext();
const page1 = await context.newPage();
const page2 = await context.newPage();
如果您还想在代码中处理页面上下文。可以使用 page.context() 函数获取浏览器页面上下文。
02.位置元素
要从元素中提取信息或单击元素,第一步是定位元素。Playwright 支持 CSS 和 XPath 选择器。
用一个实际的例子可以更好地理解这一点。在Chrome中打开要爬取的页面的URL,在第一本书上右击,选择查看源代码。
你可以看到所有的书都在 article 元素下,它有一个类 product_prod。
要选择所有书籍,您需要在所有文章元素上设置循环。可以使用 CSS 选择器选择文章元素:
.product_pod
同样,也可以使用 XPath 选择器:
//*[@class="product_pod"]
要使用这些选择器,最常用的功能如下:
● $eval(selector, function) – 选择第一个元素,将元素发送给函数,并返回函数的结果;
● $$eval(selector, function) – 与上面相同,只是它选择所有元素;
● querySelector(selector) – 返回第一个元素;
● querySelectorAll(selector) – 返回所有元素。
这些方法在 CSS 和 XPath 选择器中都能正常工作。
03. 抓取文本
继续 Books to Scrape 页面的示例,页面加载后,您可以使用选择器和 $$eval 函数提取所有书籍容器。
const books = await page.$$eval('.product_pod', all_items
=> {
// run a loop here
})
然后可以循环提取收录书籍数据的所有元素:
all_items.forEach(book => {
const name = book.querySelector('h3').innerText;
})
最后,innerText 属性可用于从每个数据点中提取数据。以下是 Node.js 中的完整代码:
const playwright = require('playwright');
(async () => {
const browser = await playwright.chromium.launch();
const page = await browser.newPage();
await page.goto('https://books.toscrape.com/');
const books = await page.$$eval('.product_pod', all_items
=> {
const data = [];
all_items.forEach(book => {
const name = book.querySelector('h3').innerText;
const price = book.querySelector('.price_color').
innerText;
const stock = book.querySelector('.availability').
innerText;
data.push({ name, price, stock});
});
return data;
});
console.log(books);
await browser.close();
})();
Python 中的代码略有不同。Python有一个函数eval_on_selector,和Node.js的$eval类似,但不适合这种场景。原因是第二个参数仍然需要是 JavaScript。在某些情况下使用 JavaScript 可能没问题,但在这种情况下,用 Python 编写整个代码会更适用。
最好使用 query_selector 和 query_selector_all 分别返回一个元素和一个元素列表。
from playwright.async_api import async_playwright
import asyncio
async def main():
async with async_playwright() as pw:
browser = await pw.chromium.
page = await browser.new_page()
await page.goto('https://books.toscrape.com')
all_items = await page.query_selector_all('.product_pod')
books = []
for item in all_items:
book = {}
name_el = await item.query_selector('h3')
book['name'] = await name_el.inner_text()
price_el = await item.query_selector('.price_color')
book['price'] = await price_el.inner_text()
stock_el = await item.query_selector('.availability')
book['stock'] = await stock_el.inner_text()
books.append(book)
print(books)
await browser.close()
if __name__ == '__main__':
asyncio.run(main())
最后,Node.js 和 Python 代码的输出是一样的。
剧作家 VS 傀儡师和硒
除了使用 Playwright 之外,您还可以在抓取数据时使用 Selenium 和 Puppeteer。
使用 Puppeteer,您可以使用的浏览器和编程语言非常有限。目前唯一可用的语言是 JavaScript,唯一兼容的浏览器是 Chromium。
对于 Selenium,虽然与浏览器语言的兼容性很好。但是,它很慢,而且对开发人员不太友好。
还有一点需要注意的是,Playwright 可以拦截网络请求。查看有关网络请求的更多详细信息。
下面是三个工具的比较:
_
剧作家
傀儡师
硒
速度
快的
快的
慢点
归档能力
优秀的
优秀的
普通的
开发经验
最多
这很好
普通的
编程语言
JavaScript、Python、C# 和 Java
JavaScript
Java、Python、C#、Ruby、JavaScript 和 Kotlin
支持者
微软
谷歌
社区和赞助商
社区
小而活跃
大而活跃
大而活跃
可用的浏览器
Chromium、Firefox 和 WebKit
铬
Chrome、Firefox、IE、Edge、Opera 和 Safari 等。
综上所述
本文探讨了 Playwright 作为爬取动态站点的测试工具的功能,并收录 Node.js 和 Python 中的代码示例。由于其异步特性和跨浏览器支持,Playwright 是其他工具的流行替代品。
Playwright 可以实现导航到 URL、输入文本、单击按钮和提取文本等功能。它可以提取动态呈现的文本。这些事情也可以通过 Puppeteer 和 Selenium 等其他工具来完成,但如果需要使用多个浏览器,或者需要使用 JavaScript/Node.js 以外的语言,Playwright 会是更好的选择。
如果您对其他类似主题感兴趣,请查看我们的 文章 关于使用 Selenium 进行网络抓取或查看 Puppeteer 教程。您也可以随时访问我们的网站与客服沟通。