网页源代码抓取工具(强大易用!新一代爬虫利器Playwright的介绍目录(组图) )

优采云 发布时间: 2022-01-12 11:03

  网页源代码抓取工具(强大易用!新一代爬虫利器Playwright的介绍目录(组图)

)

  官方文档:入门 | 剧作家蟒蛇

  参考链接:功能强大,好用!新一代爬虫工具Playwright介绍

  内容

  安装

  Playwrigth 会安装 Chromium、Firefox 和 WebKit 浏览器并配置一些驱动程序,我们不需要关心中间的配置过程,Playwright 会为我们配置。

  pip install playwright

# 安装完后初始化

playwright install

  基本用途

  打开浏览器,跳转到百度网页,打印标题;设置headless参数为False,表示显示浏览器界面。

  from playwright.sync_api import sync_playwright

with sync_playwright() as p:

rowser = browser_type.launch(headless=False)

page = browser.new_page()

page.goto('https://www.baidu.com')

print(page.title())

browser.close()

  代码生成

  我们可以在浏览器中记录我们的操作并自动生成代码,可以在爬虫中进行点击、跳转、鼠标移动等自动化操作。

  当有些步骤不知道怎么写时,自动生成代码引用很方便。

  在指定路径输入命令,会弹出对应的窗口,可以开始手动操作,会生成代码,但是操作有点复杂,好像自动生成不成功。

  playwright codegen -o script.py

  启动一个谷歌浏览器,然后将运行结果输出到script.py文件,生成代码如下图。

  以下代码,打开茶语网,点击【茶语评论】,会打开一个新窗口跳转过去。

  from playwright.sync_api import Playwright, sync_playwright

def run(playwright: Playwright) -> None:

browser = playwright.chromium.launch(headless=False)

context = browser.new_context()

# Open new page

page = context.new_page()

# Go to https://www.chayu.com/

page.goto("https://www.chayu.com/")

# Click #sub-nav >> text=茶评

# 由于弹出新窗口,需要等待,这里就是自动等待页面加载

# 点击茶评,等待页面加载

with page.expect_popup() as popup_info:

# 就页面的操作都可以在这里面继续加

page.click("#sub-nav >> text=茶评")

page1 = popup_info.value # 赋值新窗口对象

# Close page

page.close()

# Close page

page1.close()

# ---------------------

context.close()

browser.close()

with sync_playwright() as playwright:

run(playwright)

  AJAX动态加载数据获取

  获取动态加载的数据,需要注意浏览器需要在上面显示动态加载的页面才能提取出来,例如:获取评论数据,ajax加载,打开页面:

  

  如果打开页面直接提取评论数据,是无法提取的。您需要将数据滑动到页面上然后提取它(它已经死了)

  

  事件*敏*感*词*器

  Page对象提供了一个on方法,可以用来监控页面中发生的各种事件,如关闭、控制台、加载、请求、响应等。

  您可以收听响应事件。每次响应网络请求时都可以触发响应事件。我们可以设置相应的回调方法。

  可以和ajax结合使用,获取数据,拦截Ajax请求,输出对应的JSON结果。

  from playwright.sync_api import sync_playwright

def on_response(response):

if '/api/movie/' in response.url and response.status == 200:

print(response.json())

with sync_playwright() as p:

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

page = browser.new_page()

page.on('response', on_response)

page.goto('https://spa6.scrape.center/')

page.wait_for_load_state('networkidle')

browser.close()

  不加载图像

  调用route方法,第一个参数通过正则表达式传入匹配的URL路径。这表示任何收录 .png 或 .jpg 的链接。当遇到这样的请求时,会回调cancel_request方法进行处理。cancel_request 方法可以接收两个参数,一个是 route,代表 CallableRoute 对象,另一个是 request,代表 Request 对象。这里我们直接调用路由的abort方法取消请求,所以最终的结果就是图片的加载完全取消了

  from playwright.sync_api import sync_playwright

import re

with sync_playwright() as p:

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

page = browser.new_page()

# 不加载图片

def cancel_request(route, request):

route.abort()

page.route(re.compile(r"(\.png)|(\.jpg)"), cancel_request)

page.goto("https://spa6.scrape.center/")

page.wait_for_load_state('networkidle')

page.screenshot(path='no_picture.png')

browser.close()

  CSS 选择器、文本选择器、click()

  click 方法中有一个选择器表达式。解压点击后,可以设置超时时间。默认值为 30 秒,设置以毫秒为单位。如果等待5秒后点击不成功,报错timeout=5000

  # 选择文本是 Log in 的节点,并点击

page.click("text=Log in",timeout=5000)

# 选择 id 为 nav-bar 子孙节点 class 属性值为 contact-us-item,并点击

page.click("#nav-bar .contact-us-item")

# 选择文本中包含 Playwright 的 article 节点

page.click("article:has-text('Playwright')")

# 选择 id 为 nav-bar 节点中文本值等于 Contact us 的节点

page.click("#nav-bar :text('Contact us')")

# 选择 class 为 item-description 的节点,且该节点还要包含 class 为 item-promo-banner 的子节点

page.click(".item-description:has(.item-promo-banner)")

# 择的就是一个 input 节点,并且该 input 节点要位于文本值为 Username 的节点的右侧

page.click("input:right-of(:text('Username'))")

  xpath 选择器

  您需要在开头指定 xpath= 字符串,这意味着它后面是一个 XPath 表达式

  page.click("xpath=//button")

  获取网页源代码

  此处获取的网页源代码,不管网页是否通过ajax加载,都是为了获取最终的html。

  任何需要对 html 中的元素进行操作的 page.wait_for_load_state('networkidle') 都必须写入等待 html 加载。

  page.wait_for_load_state('networkidle')

html = page.content()

  文本输入

  在输入标签名称属性是 wd 输入 nba

  page.fill("input[name=\"wd\"]", "nba")

  选择提取选项卡

  提取所有class属性为list的div标签

  elements = page.query_selector_all('div.list')

  提取span标签的class属性作为score,如果有多个匹配,取第一个

  score = element.query_selector('span.score')

  提取文本

  提取带有文本[Brand:]的标签,并提取标签下的所有文本

  brand = element.query_selector('text=品牌:').text_content()

  从标签中提取属性

  提取h5标签下的a标签,得到a标签中href属性的值

   link = element.query_selector('h5 a').get_attribute('href')

  鼠标滚动

  向右滚动0,向下滚动7000,可用于下拉滚动条功能

  page1.mouse.wheel(0,7000)

  下拉滚动条

  执行js代码,下拉滚动条,15000可根据情况设置

  page1.evaluate("var q=document.documentElement.scrollTop=15000")

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线