整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

javascript 中preload、prefet

javascript 中preload、prefetch的认识

在的网络情况虽然很乐观,但是

defer和async

当浏览器碰到 script 脚本的时候:

<script src="script.js"></script>

没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。

<script async src="script.js"></script>

有 async,加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。

<script defer src="myscript.js"></script>

有 defer,加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但是 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。

然后从实用角度来说呢,首先把所有脚本都丢到 之前是最佳实践,因为对于旧浏览器来说这是唯一的优化选择,此法可保证非脚本的其他一切元素能够以最快的速度得到加载和解析。

接着,我们来看一张图咯:


此图告诉我们以下几个要点:

  1. defer 和 async 在网络读取(下载)这块儿是一样的,都是异步的(相较于 HTML 解析)
  2. 它俩的差别在于脚本下载完之后何时执行,显然 defer 是最接近我们对于应用脚本加载和执行的要求的
  3. 关于 defer,此图未尽之处在于它是按照加载顺序执行脚本的,这一点要善加利用
  4. async 则是一个乱序执行的主,反正对它来说脚本的加载和执行是紧紧挨着的,所以不管你声明的顺序如何,只要它加载完了就会立刻执行
  5. 仔细想想,async 对于应用脚本的用处不大,因为它完全不考虑依赖(哪怕是最低级的顺序执行),不过它对于那些可以不依赖任何脚本或不被任何脚本依赖的脚本来说却是非常合适的,


preload和refetch

preload通常在页面中,我们需要加载一些脚本和样式,而使用 preload 可以对当前页面所需的脚本、样式等资源进行预加载,而无需等到解析到 script 和 link 标签时才进行加载。这一机制使得资源可以更早的得到加载并可用,且更不易阻塞页面的初步渲染,进而提升性能。

使用方式

将 link 标签的 rel 属性的值设为 preload,as 属性的值为资源类型(如脚本为 script,样式表为 style)

<head>
 
<metacharset="utf-8">
 
<title>
preload example
</title>
 
<!-- 对 style.css 和 index.js 进行预加载 -->
 
<link rel="preload" href="style.css" as="style">
 
<link rel="preload" href="index.js" as="script">
 
<link rel="stylesheet" href="style.css">
</head>
<body>
 
<div id="app"></div>
 
<script src="index.js"></script>
</body>

prefetch与 preload 一样,都是对资源进行预加载,但是 prefetch 加载的资源一般不是用于当前页面的,即未来很可能用到的这样一些资源,简单点说就是其他页面会用到的资源。当然,prefetch 不会像 preload 一样,在页面渲染的时候加载资源,而是利用浏览器空闲时间来下载。当进入下一页面,就可直接从 disk cache 里面取,既不影响当前页面的渲染,又提高了其他页面加载渲染的速度。

使用方式

同 preload 很相似,无需指定 as 属性:

<head>
 
<meta charset="utf-8">
 
<title>
preload example
</title>
 
<!-- 对 style.css 和 index.js 进行 preload 预加载 -->
 
<link rel="preload" href="style.css" as="style">
 
<link rel="preload" href="index.js" as="script">
 
<!-- 对资源进行 prefetch 预加载 -->
 
<link rel="prefetch" href="next.css">
 
<link rel="prefetch" href="next.js">
 
<link rel="stylesheet" href="style.css">
</head>
<body>
 
<divid="app"></div>
 
<script src="index.js"></script>
</body>

总结:对当前页面需要的资源,使用 preload 进行预加载,对其它页面需要的资源进行 prefetch 预加载。

Subresource和Prerender

subresource可以用来指定资源是最高优先级的。比如,在Chrome和Opera中我们可以加上下面的代码:

<link rel="subresource" href="styles.css">

Chromium的文档这么解释:和 "Link rel=prefetch"的语义不同,"Link rel=subresource"是一种新的连接关系。rel=prefetch指定了下载后续页面用到资源的低优先级,而rel=subresource则是指定当前页面资源的提前加载。

所以,如果资源是在当前页面需要,或者马上就会用到,则推荐用subresource,否则还是用prefetch。

prerender是一个重量级的选项,它可以让浏览器提前加载指定页面的所有资源。

<link rel="prerender" href="/thenextpage.html" />

Steve Souders的文章详细解释了这个技术:prerender就像是在后台打开了一个隐藏的tab,会下载所有的资源、创建DOM、渲染页面、执行JS等等。如果用户进入指定的链接,隐藏的这个页面就会进入马上进入用户的视线。Google Search多年前就利用了这个特性实现了Instant Pages功能。微软最近也宣布会让Bing在IE11上用类似prerender的技术。

但是要注意,一定要在十分确定用户回点某个链接时才用这个特性,否则客户端就会无端的下载很多资源和渲染这个页面。

正如任何提前的动作一样,预判总是有一定风险出错。如果提前的动作是昂贵的(比如高CPU、耗电、占用带宽),就要谨慎使用了。虽然不容易预判用户会点进哪个页面,但还是存在一些典型的场景:

如果用户搜索到了一个明显正确的结果时,那么这个页面就很有可能被点入

如果用户在登录页面,那么登录成功后的页面就很可能接下来会被加载了

如果用户在阅读一个多页面的文章或者有页码的内容时,下一页就很可能会马上被点击了

利用Page Visibility API可以用来防止页面在还没真正展示给用户时就触发了JS的执行。

参考:

defer和async(https://segmentfault.com/q/1010000000640869)

prefetch与 preload(https://segmentfault.com/a/1190000016949393)

prefetch预加载(https://developer.mozilla.org/zh-CN/docs/Web/HTTP/LinkprefetchingFAQ)

preload当即加载(https://developer.mozilla.org/zh-CN/docs/Web/HTML/Preloadingcontent) 加载技术概述(http://www.alloyteam.com/2015/10/prefetching-preloading-prebrowsing/) dnc fetch(https://developer.mozilla.org/zh-CN/docs/ControllingDNS_prefetching)

Prerender Subresource

END

作者:caoweiju

https://segmentfault.com/a/1190000016955899

日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。

如今,当我们想要基于 React 创建一个新的 Web 项目时,我们有许多不同的框架选择。

如今,当我们想要基于 React 创建一个新的 Web 项目时,我们有许多不同的框架选择。作为一名开发人员,您会发现自己很难知道应该选择哪一种,或者哪一种最适合您的需求。

您可能知道最常用的框架之一是Next.js,Netflix、Twitch 或 Uber 等公司通常使用它。它被认为是增长最快的 React 框架之一。

其他人很难与 Next.js 竞争,因为它涵盖了三种不同的页面渲染策略,但自 2021 年 11 月以来,我们似乎有了一个新的、新鲜的、强大的框架,称为Remix。

对不起盖茨比,我没有忘记你,我喜欢你在生成静态站点时的工作方式。

为什么需要 Next.js 或 Remix 而不是普通的 React
也许你没有;这取决于。重点是了解 React 应用程序如何工作,您可能会发现哪些问题以及 Next.js 或 Remix 等框架如何解决这些问题。

关于 React 的要点是您可以制作单页应用程序 (SPA),其中仅使用一个 HTML 文件来呈现所有网页,并且路由保留在客户端。但这到底是什么意思呢?

当发出初始请求时,浏览器会立即收到一个包含所有应用程序的 HTML 框页面。
没有预渲染的内容。
当用户导航触发时,JavaScript 仅替换那些与请求的路由相关的组件和内容,但 HTML 文件保持不变。
简而言之,浏览器负责管理应加载哪个 JavaScript 文件以呈现当前页面。换句话说,客户端呈现 (CSR)。

CSR 可以非常花哨并且有助于创建不需要关心 SEO、缓存或缓慢的初始渲染的应用程序。

SSlow Initial Render——当用户第一次登陆时,可能需要很长时间才能加载第一个内容页面。这意味着让他们得到一个空白页面,直到 JavaScript 加载并呈现所有内容。
SEO——因为内容只有一个 HTML 页面,所以很难让搜索引擎和社交媒体机器人对内容进行索引。
缓存问题——HTML 结构无法缓存,因为它在第一次渲染时不可用。
在这一点上,您可能认为 SPA 是魔鬼,但想想这么多公司使用的所有内部应用程序或他们销售的应用程序产品。

当您想利用 SPA 的工作方式而又不失去我之前提到的三点时,Next.js或Remix就会出现。优点是网站可以在发送到客户端之前在服务器端呈现。

SSR vs SSG vs ISR
我已经解释了 CSR 的含义和工作原理,现在轮到我来谈谈其他花哨的页面呈现策略。

Next.js是一个强大的选项,因为它提供了三个开箱即用的不同选项,而Remix完全依赖于 SSR(目前)。但这些策略究竟是如何运作的呢?

服务器端渲染 (SSR)
当一个页面被请求时,它在发送到客户端之前在服务器上完全呈现。对于那些拥有大量动态数据和内容的网站来说,这是一个很好的选择。

静态站点生成 (SSG)
该策略在构建期间按路由生成所有页面。出现提示时,只会将请求的页面发送给客户端。也就是说,这构建了一个典型的静态网站。

对于那些几乎没有或没有动态数据且页面不多的静态网站来说,它可能是一个合适的选择。数据中的每个更改都会触发所有页面的重新生成。

增量静态再生 (ISR)
Next.js 提供了这个概念,是 SSR 和 SSG 的混合体。

它类似于 SSG,但您可以设置一个间隔时间,让您知道何时应该重新生成您的页面。适用于那些具有动态内容的静态站点。

Next.js 的强项在于它允许您在每个页面上的这三个选项之间切换,因此您可以让每个选项遵循不同的策略。

所以也许你会问自己,“如果 Next.js 只适用于 SSR,我为什么要用 Remix 替换它”。答案很简单,如今,应用程序和网站往往具有动态数据,并且很少有适合 SSG 或 ISR 场景的示例。

考虑到这一点,Remix 提供了一个较低级别的 API。例如,它公开了 Request 对象,因此您可以在呈现页面之前轻松修改标头,而在 Next.js 中,您需要中间件来实现它。

路由
这两个框架都使用基于文件的路由系统来呈现页面。

每个页面都保留在不同的文件中。
每个页面都与基于其文件名的路由相关联。
最后,每个页面都会呈现一个 React 组件。
混音中的路由
您将在 中添加每个路由/app/routes,并且在其中创建的每个文件或文件夹都将被视为一个路由。

混音路由 1
此外,您会发现一个文件,/app/root.jsx,其中是“根路由”,是整个应用程序的布局。它包含 <html>、<head> 和 <body> 标签,以及其他与 Remix 相关的内容。

Next.js 中的路由
您将在 中添加每条路线/pages,它的工作方式与 Remix 完全相同。

nextjs 路由 1
在这种情况下,您可能有也可能没有pages/_app.jsand pages/_document.js。其中App用于初始化页面,文档包含标签。

Next.js 默认使用它们,无需额外配置。但是,如果您需要自定义它们,您可以创建这两个文件,以这种方式覆盖默认文件。

索引路线
他们都使用相同的系统来呈现容器路线。

Next.js 示例:

pages/index.js=> /(根页面)
pages/posts/index.js或者pages/posts.js=>/posts
混音示例:

routes/index.js=> /(根页面)
routes/posts/index.js或者routes/posts.js=>/posts
嵌套路由
Remix 建立在 React Router 之上,由同一个团队开发,所以你可以想象在嵌套路由方面谁是赢家。
其背后的想法是创建一个活动路由来挂载包含多个嵌套路由的布局,以便每个路由管理自己的内容。

如果我必须用 React 语言来解释它,我会告诉你想象每个嵌套路由都是一个组件,并且根据 URL 路径,它们可以被挂载和卸载。

为实现这一点,Remix 使用了<Outlet />React-router 组件。它用在父路由上,告诉它们只要被触发就渲染子路由元素。
请记住,所有这些嵌套路由都已预加载到服务器上,因此几乎每个加载状态都可以删除。听起来不像是 SSR 和 SPA 的混合体?

另一方面,Next.js 确实支持嵌套路由,但它们作为单独的页面工作。如果您想实现类似于 Remix 所做的事情,您可能应该自定义您的_app.js.

两者的示例:

routes/posts/news/index.js=>/posts/news
动态路线
它们通过基于动态的 URL 参数呈现不同的内容来工作,但它使用单个路由文件。
在这种情况下,两个框架都支持此功能,但使用不同的命名约定。

Next.js 示例:

pages/posts/[postId].js=>/posts/some-post-slug
pages/products/[category]/[productId].js=>/products/keyboards/some-keyboard-slug或/products/headphones/some-headphone-slug
它有自己的钩子,useRouter将为您提供那些动态参数(postId、类别、productId)的当前值。

混音示例:

/app/routes/posts/$postId.js=>/posts/some-post-slug
/app/routes/products/$category/$productId.js=>/products/keyboards/some-keyboard-slug或/products/headphones/some-headphone-slug
您可以使用useParamReact Router hook 来访问这些动态参数。

需要加载文件的路由怎么办?
想象一下,您需要您的网站包含典型文件robots.txt和sitemap.xml文件。

在 Next.js 和 Remix 中,您都可以将它们添加到 /public 目录。但是 Remix 可以让你通过路由系统实现它,只需创建一个/app/routes/[sitemap.xml].js或/app/routes/[robots.txt].js

数据加载
这两个框架都是服务器端的,因此每个框架都有不同的系统来获取数据和手动调用 API。

对于 Next.js,您可以在两个选项中进行选择,具体取决于您要构建的页面类型。

getStaticProps(SSG,如果设置了重新验证间隔,则为 ISR)——它在构建时获取数据并将其数据作为页面的组件属性提供。
export async function getStaticProps( {params} ) {
const productList=await getProductList()

return {
props: {
productList,
slug: params.slug
}
}
}


getServerSideProps (SSR) — 它在运行时在服务器端获取数据,并将返回的数据作为页面的组件道具提供。
export async function getStaticProps( {params} ) {
const productList=await getProductList()

return {
props: {
productList,
slug: params.slug
}
}
}


/**
* Here you would have your own getStaticProps/getServerSideProps functions
* depending on what system you choose.
**/

const PageName=(props)=> {
const { productList }=props
// Here you could render the requested data
return (<div>
<pre> {JSON.stringify(productList, null, 4)} </pre>
</div>)
}


Remix 使用不同的方式加载数据;

它为您提供了一个loader在每个路由文件上使用的函数,该文件将在运行时在服务器端运行。
在页面组件本身上,您将能够使用useLoaderData挂钩来收集这些数据。
/**
* Here you would have your own getStaticProps/getServerSideProps functions
* depending on what system you choose.
**/
export const async loader=( {params} )=> {
const productList=await getProductList()
return {
productList,
slug: params.slug
}
};

export default function PageName() {
const { productList }=useLoaderData();

// Here you could render the requested data
return (<div>
<pre> {JSON.stringify(productList, null, 4)} </pre>
</div>)
}


数据突变
Next.js 没有内置的方式来执行突变,你必须手动进行。
另一方面,Remix 创建了一个表单组件,并像使用浏览器的本机 HTML 表单元素一样使用它。如果您不输入任何操作 URL,它将对表单使用相同的路由。

如果方法是GET,loader将触发导出函数,如果方法是POST,action将触发定义在组件中的导出函数。

此外,您可以使用提供的 useTransition 挂钩根据请求状态管理应用程序的行为,而无需像往常一样手动管理它。

export const loader=async ({ params })=> {
// Each time this page receive a GET Request, this loader will be executed
const userData=await getSomeUserData(params.slug)

return {
userData // it contains the User Name
}
}

export const action=async ({ request })=> {
// Each time this page receive a POST Request, this loader will be executed
const form=await request.formData()
const content=form.get('content')

return redirect('/')
}

export default function App() {
const { name }=useLoaderData();

return (
<div>
<div>{`Hello there ${name}`}</div>

<Form method="POST">
<label htmlFor="content">
Content: <textarea name="content" />
</label>

<input type="submit" value="Add New" />
</Form>
</div>
)
}


造型
Next.js 带有开箱即用的内置 CSS 支持,因此您可以直接将其导入到 /pages/_app.js 所需的任何 style.css 文件中。

您还可以添加其他 CSS 框架,使用一些配置或插件很容易实现。

linksRemix 更喜欢通过提供组件和导出功能来专注于对 Web 标准更加友好的解决方案。

import styles from "./styles/app.css";

export function links() {
return [
{ rel: "stylesheet", href: styles },
{ rel: "stylesheet", href: 'https://.....' },
];
}

export default function App() {
return (
<html lang="en">
<head>
<Links />
</head>
<body>
<Outlet />
</body>
</html>
);
}


您可能认为仅仅加载一个样式表有点过分了,但是如果我告诉您可以在每个页面上单独使用它,让您仅在需要时加载特定样式/字体怎么办?

另外,在这里你可以使用其他的 CSS 框架,只需很少的配置,比如 Tailwindcss。

图像优化
Next.js 在这里获胜,因为它有自己的内置组件next/image,可以实现图像优化、延迟加载、大小控制和集成加载器。不幸的是,目前 Remix 没有任何图像优化支持。

搜索引擎优化
在本文的开头,我告诉过您这些框架背后的要点之一是解决 SPA 的 SEO 问题。

它们都有自己的内置机制来动态管理每个页面上应该使用哪些元数据,例如关键字、标题、描述等。

next/head在 Next.js 中,您可以通过将其导入页面/路由来使用其内置组件。

import Head from 'next/head'

export default function PostPage() {
return (
<div>
<Head>
<title>Post Page Title</title>
<meta name="description" content="Post Page Description" />
</Head>
<p>
All the metadata inside Head component will be injected into the
documents head
</p>
</div>
)
}


另一方面,Remix 为我们提供了一个meta导出函数,可以接收页面的请求数据以及 URL 参数。

export const meta=({ data, params })=> {
charset: "utf-8",
viewport: "width=device-width,initial-scale=1",
title: `Post | ${data.title}`,
description: data.description,
};

export default function PostPage() {
return (
<div>
<p>
All the metadata returned on meta function will be injected into the
documents head
</p>
</div>
)
}


错误处理
Next.js 使您可以在捕获某些错误时定义自定义页面,例如 400 或 500 错误。但是除了路由或状态错误之外的任何其他错误都会导致页面中断。

Remix 让您尽情发挥想象力,这样您就可以覆盖和自定义您想要的每个错误。他们添加了错误边界,这是一种处理错误的独特概念——在 React v16 中引入。

您可以通过在您的甚至每个页面上使用CatchBoundary, 和ErrorBoundary导出的函数轻松地覆盖这些错误。root.tsx让我们添加一些视觉示例。

// Here you will catch any controlled error and will tell the framework what information should be shown
const CatchBoundary=()=> {
let caught=useCatch();

switch (caught.status) {
case 401:
// Document is a custom React Component which contains <html>, <head>,<body>, etc
return (
<Document title={`${caught.status} ${caught.statusText}`}>
<h1>
{caught.status} {caught.statusText}
</h1>
</Document>
);

case 404:
return <PageNotFoundComponent />; // Yes, you can also use a React Component
default:
throw new Error(
`Unexpected caught response with status: ${caught.status}`
);
}
};

// Here you will have a more generic advise for when an uncontrolled error has been triggered
const ErrorBoundary=( { error } )=> {
return (
<Document title="Uh-oh!">
<h1>App Error</h1>
<pre>{error.message}</pre>
<p>
Replace this UI with what you want users to see when your app throws
uncaught errors.
</p>
</Document>
);
};

export const loader: LoaderFunction=async ({ params })=> {
const post=await getPost(params.slug);

if (!post) {
throw new Response("Not Found", {
status: 404,
});
}

return json({ post });
};

export default function PostPage() {
const { post }=useLoaderData();
return (
<div>
<pre>
{JSON.stringify(post, null, 4)}
</pre>
</div>
)
}


部署
Next.js 很容易部署在任何支持 Node.js 的服务器上。它还集成了无服务器部署到 Vercel 的功能,Netlify 有自己的适配器,因此您可以轻松部署应用程序。

Remix 基于 Web Fetch API 而不是 Node.js 构建,因此它可以在 Vercel、Netlify、Architect(Node.js 服务器)以及 Cloudflare 等非 Node.js 环境中运行。

它还会在您开始项目时为您提供开箱即用的适配器,因此如果您知道要将项目部署到哪里,就可以直奔主题。

Remix 最重要的事情之一是它不再使用 Webpack。相反,它使用 Esbuild,它在捆绑和部署方面速度极快。

其他提及
每当您想选择 Next.js 或 Remix 时,还有其他要点需要考虑,但我想收集那些在我看来作为开发人员在开发项目时具有更大影响的因素。
但如果您想了解更多,这里有一些我在本文中没有谈到的事情的回顾。

实时重新加载。Next.js 使用热模块重新加载 (HMR) 并默认启用,而在 Remix 上,您必须在 root.tsx 上添加一个组件以强制您的应用程序在代码更改时重新加载。
Remix 支持 Cookie、会话和身份验证,而 Next.js 不支持——您必须使用外部库。
Next.js 内置了对字体和脚本优化的支持,而 Remix 则没有。
两者都让您开箱即用地使用 Typescript。
Remix 无需执行 JavaScript 即可完成其大部分功能,而 Next.js 则不会。
Remix 可以在嵌套路由中包含独立路由
两者都可以使用 Tailwindcss 快速工作,并有自己的指南来实现它。
Next.js 内置了对国际化路由的支持。
Next.js 对 AMP 具有开箱即用的支持,而 Remix 则没有。

本使用

  1. 导入:from selenium import webdriver
  2. 创建浏览器操作对象:browser=webdriver.Chrome()
  3. 访问网站
  4. 1
    2
    3
    # 访问网站
    url='https://www.jd.com'
    browser.get(url)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"""
selenium基本使用

Author:binxin
Date:2023/11/29 14:42
"""
# 导入
from selenium import webdriver

# 创建浏览器操作对象
browser=webdriver.Chrome()

# 访问网站
url='https://www.jd.com'
browser.get(url)

# page_source获取网页源码
content=browser.page_source
print(content)

元素定位

  1. 导入:from selenium.webdriver.common.by import By
1
2
3
4
5
6
7
8
9
10
11
inputTag=driver.find_element(By.ID, "value")

inputTag=driver.find_element(By.CLASS_NAME, "value")

inputTag=driver.find_element(By.NAME, "value")

inputTag=driver.find_element(By.TAG_NAME, "value")

inputTag=driver.find_element(By.XPATH, "value")

inputTag=driver.find_element(By.CSS_SELECTOR, "value")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
"""
selenium 元素定位
Author:binxin
Date:2023/11/29 15:05
"""
from selenium import webdriver
from selenium.webdriver.common.by import By

browser=webdriver.Chrome()

url='https://www.baidu.com'

browser.get(url)

# 元素定位

# 根据ID找到对象
# button=browser.find_element(By.ID,'su')

# 根据标签属性的属性值获取对象
# button=browser.find_element(By.NAME, 'wd')

# 根据xpath语句获取对象
# button=browser.find_element(By.XPATH, '//input[@id="su"]')

# 根据标签名获取对象
# button=browser.find_element(By.TAG_NAME, 'input')

# 使用bs4的语法获取对象
# button=browser.find_element(By.CSS_SELECTOR, '#su')

button=browser.find_element(By.LINK_TEXT, '新闻')
print(button)

元素信息

  1. 获取元素属性:.get_attribute('class')
  2. 获取元素文本:.txt
  3. 获取标签名:.tag_name
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
"""
元素信息

Author:binxin
Date:2023/11/29 16:31
"""
from selenium import webdriver
from selenium.webdriver.common.by import By

browser=webdriver.Chrome()

url='https://www.baidu.com'
browser.get(url)

input=browser.find_element(By.ID, 'su')

# 获取标签的属性
print(input.get_attribute('class'))
# 获取标签名
print(input.tag_name)

a=browser.find_element(By.LINK_TEXT, '新闻')
# 获取元素文本
print(a.text)

交互

  1. 点击:click()
  2. 输入:send_keys()
  3. 后退操作:browser.back()
  4. 前进操作:browser.forward()
  5. 模拟JS滚动:
  6. 1
    2
    js='document.documentElement.scrollTop=100000'
    browser.execute_script(js)
    # 执行js代码
  7. 获取网页代码:page_source
  8. 退出:browser.quit()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""
selenium交互

Author:binxin
Date:2023/11/29 16:47
"""
from selenium import webdriver
from selenium.webdriver.common.by import By

browser=webdriver.Chrome()

url='https://www.baidu.com'

browser.get(url)

import time

time.sleep(2)

# 获取文本框对象
input=browser.find_element(By.ID, 'kw')

# 在文本框中输入周杰伦
input.send_keys('周杰伦')

time.sleep(2)

# 获取百度一下按钮
button=browser.find_element(By.ID, 'su')

# 点击按钮
button.click()

time.sleep(2)

# 滑动窗口到底部
js_bottom='document.documentElement.scrollTop=100000'
browser.execute_script(js_bottom)

time.sleep(2)

# 获取下一页按钮
next=browser.find_element(By.XPATH, '//a[@class="n"]')
# 点击下一页
next.click()

time.sleep(2)

# 返回上一页
browser.back()
time.sleep(2)

# 重新回到上一页
browser.forward()

time.sleep(3)

# 退出
browser.quit()

Chrome handless

  1. 基本代码
  2. 1
    2
    3
    4
    5
    6
    7
    8
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options

    chrome_options=Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')

    browser=webdriver.Chrome(options=chrome_options)
  3. 封装配置
  4. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options


    def share_browser():
    chrome_options=Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')

    browser=webdriver.Chrome(options=chrome_options)

    return browser