网页源代码抓取工具(强大易用!新一代爬虫利器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")