js 爬虫抓取网页数据(Node.js和Python的代码片段作引教您如何在Chromium中使用代理)

优采云 发布时间: 2021-11-10 14:04

  js 爬虫抓取网页数据(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 教程。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线