js 爬虫抓取网页数据(Node.js和Python的代码片段作引教您如何在Chromium中使用代理)
优采云 发布时间: 2021-11-10 14:04js 爬虫抓取网页数据(Node.js和Python的代码片段作引教您如何在Chromium中使用代理)
剧作家网络爬虫教程
近年来,随着互联网行业的发展,互联网的影响力逐渐增强。这也是由于技术的进步,开发了越来越多用户体验良好的应用。另外,从web应用的开发到测试,整个过程中自动化的使用越来越流行。网络爬虫工具正变得越来越流行。
拥有有效的工具来测试 Web 应用程序是必不可少的。Playwright 等图书馆在浏览器中打开 Web 应用程序,并使用其他交互(例如单击元素、键入文本和从 Web 提取公共数据)来加快整个过程。
本教程将解释有关 Playwright 的相关内容以及如何将其用于自动化甚至网络抓取。
什么是剧作家?
Playwright 是一个测试和自动化框架,可以实现与 Web 浏览器的自动化交互。简而言之,您可以编写代码来打开浏览器,并使用代码来实现所有网页浏览器的功能。自动化脚本可以实现导航到URL、输入文本、点击按钮和提取文本等功能。Playwright 最令人惊奇的特性是它可以同时处理多个页面,而无需等待或被阻止。
Playwright 支持大多数浏览器,例如 Google Chrome、Firefox、使用 Chromium 核心的 Microsoft Edge 和使用 WebKit 核心的 Safari。跨浏览器网络自动化是 Playwright 的强项,它可以有效地为所有浏览器执行相同的代码。此外,Playwright 支持 Node.js、Python、Java 和 .NET 等多种编程语言。您可以编写代码来打开 网站 并使用这些语言中的任何一种与之交互。
Playwright 的文档非常详细,涵盖的范围很广。它涵盖了从入门到高级的所有类和方法。
支持剧作家代理
Playwright 支持使用代理。我们将使用以下Node.js和Python的代码片段作为参考,逐步教你如何在Chromium中使用代理:
节点.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()
上面的代码只需要稍微修改一下就可以集成agent了。使用 Node.js 时,启动函数可以接受 LauchOptions 类型的可选参数。这个 LaunchOption 对象可以发送其他几个参数,例如 headless。另一个需要的参数是代理。这个代理是另一个具有这些属性的对象:服务器、用户名、密码等。第一步是创建一个可以指定这些参数的对象。
// Node.js
const launchOptions = {
proxy: {
server: 123.123.123.123:80'
},
headless: false
}
第二步是将此对象传递给 start 函数:
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 的住宅代理访问特定国家、省份甚至城市的站点。最重要的是,您还可以轻松地将 Oxylabs 的代理与 Playwright 集成。
01. 使用 Playwright 进行基本抓取
下面我们将介绍如何在 Node.js 和 Python 中使用 Playwright。
如果您使用的是 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();
})();
我们来看看上面的代码。剧作家被导入到代码的第一行。然后,启动了一个 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 Puppeteer 和 Selenium
在获取数据时,除了使用 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 教程。