爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息

web自动化 -- pyppeteer 由于Selenium具有这些严重的缺点。pyperteer成为了爬虫界的又一新星。相比于selenium具有以下特点:异步加载速度快具备有界面/无界面模式伪装性更强不易被识别为机器人同时可以伪装手机平板等终端虽然支持的浏览器比较单一,但在安装配置的便利性和运行效率方面都要远胜selenium。pyppeteer无疑为防爬墙撕开了一道大口子,针对selenium的淘宝、美团、文书网等网站,目前可通过该库使用selenium的思路继续突破,毫不费劲。 阅读详情

提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用。但是 selenium 的缺点也很明显,比如速度太慢、对版本配置要求严苛,最麻烦是经常要更新对应的驱动。还有些网页是可以检测到是否是使用了selenium 。并且selenium 所谓的保护机制不允许跨域 cookies 保存以及登录的时候必须先打开网页然后后加载 cookies 再刷新的方式很不友好。

今天给大家介绍另一款 web 自动化测试工具 Pyppeteer,虽然支持的浏览器比较单一,但在安装配置的便利性和运行效率上相比selenium要好。介绍 Pyppeteer 之前先说一下 Puppeteer,Puppeteer 是 Google 基于 Node.js 开发的一个工具,主要是用来操纵 Chrome 浏览器的 API,通过 Javascript 代码来操纵 Chrome 浏览器的一些操作,用作网络爬虫进行数据爬取、Web 程序自动测试等任务。其 API 极其完善,功能非常强大。 而 Pyppeteer 实际上是 Puppeteer 的 Python 版本的实现,但他不是 Google 开发的,是一位来自于日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本。

1. Pyppeteer介绍

Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用作网络爬虫上,其 API 极其完善,功能非常强大,Selenium 当然同样可以做到。而 Pyppeteer 又是什么呢?它实际上是 Puppeteer 的 Python 版本的实现,但它不是 Google 开发的,是一位来自于日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本。在 Pyppetter 中,实际上它背后也是有一个类似 Chrome 浏览器的 Chromium 浏览器在执行一些动作进行网页渲染,首先说下 Chrome 浏览器和 Chromium 浏览器的渊源。Chromium 是谷歌为了研发 Chrome 而启动的项目,是完全开源的。二者基于相同的源代码构建,Chrome 所有的新功能都会先在 Chromium 上实现,待验证稳定后才会移植,因此 Chromium 的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium 的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的 Logo,但配色不同,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不同深度的蓝色构成。


总而言之,两款浏览器的内核是一样的,实现方式也是一样的,可以认为是开发版和正式版的区别,功能上基本是没有太大区别的。

Pyppeteer 就是依赖于 Chromium 这个浏览器来运行的。在有了 Pyppeteer 之后,就可以免去那些烦琐的环境配置等问题。第一次运行的时候,如果Chromium 浏览器没有安装,那么程序会帮我们自动安装和配置,就免去了烦琐的环境配置等工作。另外 Pyppeteer 是基于Python 的新特性 async 实现的,所以它的一些执行也支持异步操作,效率相对于 Selenium 来说也提高了。

2. Pyppeteer的安装与使用

安装:

由于 Pyppeteer 采用了 Python 的 async 机制,所以其运行要求的 Python 版本为 3.5 及以上。安装方式很简单,命令行pip安装即可。

pip3 install pyppeteer
1

安装完成之后在命令行测试:

import pyppeteer
1

如果没有报错,那就证明安装成功了。

使用:

Pyppeteer 是一款非常高效的 web 自动化测试工具,由于 Pyppeteer 是基于 asyncio 构建的,它的所有属性和方法几乎都是coroutine (协程) 对象,因此在构建异步程序的时候非常方便,天生就支持异步运行。

测试代码如下:

import asyncio
from pyppeteer import launch
import random


def screen_size():
    # 使用tkinter获取屏幕大小
    import tkinter
    tk = tkinter.Tk()
    width = tk.winfo_screenwidth()
    height = tk.winfo_screenheight()
    tk.quit()
    return width, height



async def main():
    # 建立一个浏览器对象
    browser = await launch(headless=False)
    # 打开新的标签页
    page = await browser.newPage()
    # 设置网页视图大小
    width, height = screen_size()
    await page.setViewport(viewport={'width': width, 'height': height})
    # 访问目标url网页
    await page.goto('https://www.baidu.com/', options={'timeout': 5 * 1000})
    # 休眠
    await asyncio.sleep(10)
    # 对当前页面截图并保存为example1.png
    await page.screenshot({'path': 'example1.png'})
    # 搜索框输入  python Pyppeteer爬虫
    await page.type('#kw', 'python Pyppeteer爬虫')
    # 点击百度一下
    await page.click('#su')
    # 休眠
    await asyncio.sleep(random.randint(1, 3))
    # 对当前页面截图并保存为example2.png
    await page.screenshot({'path': 'example2.png'})
    # 关闭浏览器
    await browser.close()


asyncio.get_event_loop().run_until_complete(main())
12345678910111213141516171819202122232425262728293031323334353637383940414243

第一次使用 pyppeteer 的时候会自动下载并安装 chromium 浏览器

运行效果如下:

页面截图:

 

程序成功运行,在main函数中进行的操作有,初始化一个浏览器对象,然后打开新的标签页,设置页面视图大小,访问百度主页,对当前页面截图并保存为example1.png,然后模拟在搜索框中输入’python Pyppeteer爬虫’,模拟点击百度一下,跳转到搜索结果网页,再对当前页面截图并保存为example2.png,最后关闭浏览器。pyppeteer是基于asyncio 构建的,所以在使用的时候要用到 async/await 结构。

用Pyppeteer启动浏览器,调用 launch 方法即可实现。

pyppeteer.launcher.launch(options: dict = None, **kwargs) → pyppeteer.browser.Browser
1

可以看到它处于 launcher 模块中,参数没有在声明中特别指定,返回类型是 browser 模块中的 Browser 对象,另外查看其源码发现这是一个 async 修饰的方法,所以调用它的时候需要使用 await。

常用参数:

  • headless (bool):是否启用 Headless 模式,即无界面模式,如果 devtools 这个参数是 True 的话,那么该参数就会被设置为 False,否则为 True,即默认是开启无界面模式的。
  • devtools (bool):**是否为每一个页面自动开启调试工具,**默认是 False。如果这个参数设置为 True,那么 headless 参数就会无效,会被强制设置为 False。
  • args (List[str]):在执行过程中可以传入的额外参数。
  • userDataDir (str):即用户数据文件夹,即可以保留一些个性化配置和操作记录。
  • loop (asyncio.AbstractEventLoop):事件循环对象。
  • executablePath (str):可执行文件的路径,如果指定之后就不需要使用默认的 Chromium 了,可以指定为已有的 Chrome 或 Chromium。
  • env (dict):环境变量,可以通过字典形式传入。

禁用提示条
在之前运行效果图中,我们可以看到上面的一条提示:“Chrome 正受到自动测试软件的控制”,不喜欢这个提示出现的话,我们可以利用 args 参数将其禁用,禁用操作如下:

browser = await launch(headless=False, args=['--disable-infobars'])
1

修改网站检测浏览器特征值

只是把提示关闭了,有些网站还是会检测到是 WebDriver,测试如下:

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch(headless=False, args=['--disable-infobars'])
    page = await browser.newPage()
    await page.setUserAgent("Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5")
    await page.setViewport(viewport={'width': 1536, 'height': 768})
    await page.goto('https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html')
    await asyncio.sleep(25)
    await browser.close()


asyncio.get_event_loop().run_until_complete(main())
123456789101112131415

运行效果如下:

这说明 Pyppeteer 开启 Chromium 照样还是能被检测到 WebDriver 的存在。
无论是selenium的execute_script()方法,还是pyppeteer的evaluate()方法执行下面代码都能临时修改浏览器属性中的webdriver属性,当页面刷新或者跳转之后该值就原形毕露。

() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }
1

但是pyppeteer的最底层是封装的puppeteer,是js库,是和网站源码交互最深的方式。
在pyppeteer中提供了一个方法:evaluateOnNewDocument(),该方法是将一段js代码加载到页面文档中,当发生页面导航、页面内嵌框架导航的时候加载的js代码会自动执行,那么当页面刷新的时候该js也会执行,这样就保证了修改网站的属性持久化的目的。

await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
                                     '{ webdriver:{ get: () => false } }) }')  
12

代码改写如下:

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch(headless=False, args=['--disable-infobars'])
    page = await browser.newPage()
    await page.setUserAgent("Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5")
    await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
                                       '{ webdriver:{ get: () => false } }) }')  
    await page.setViewport(viewport={'width': 1536, 'height': 768})
    await page.goto('https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html')
    await asyncio.sleep(25)
    await browser.close()


asyncio.get_event_loop().run_until_complete(main())
1234567891011121314151617

运行效果如下:


可以看到,绕过了 WebDriver 的检测。

开启无痕模式
Chrome 浏览器是可以开无痕模式的,它的好处就是环境比较干净,不与其他的浏览器示例共享 Cache、Cookies 等内容,其开启方式可以通过 createIncognitoBrowserContext 方法,代码如下:

import asyncio
from pyppeteer import launch

width, height = 1536, 768


async def main():
    browser = await launch(headless=False,
                           args=['--disable-infobars', f'--window-size={width},{height}'])
    context = await browser.createIncognitoBrowserContext()
    page = await context.newPage()
    await page.setViewport({'width': width, 'height': height})
    await page.goto('https://www.baidu.com')
    await asyncio.sleep(5)
    await browser.close()


asyncio.get_event_loop().run_until_complete(main())
123456789101112131415161718

更多详细使用可以参考如下文档

  • pyppeteer github 地址:https://github.com/miyakogi/pyppeteer
  • pyppeteer 常用方法手册:https://blog.zhangkunzhi.com/2019/05/13/pyppeteer%E5%B8%B8%E7%94%A8%E6%96%B9%E6%B3%95%E6%89%8B%E5%86%8C/index.html

3. Pyppeteer爬虫实战 异步爬取京东商城书籍信息

有些网站的页面是 JavaScript 渲染而成的,我们所看到的内容都是网页加载后又执行了JavaScript代码之后才呈现出来的,因此这些数据并不存在于原始 HTML 代码中,而 requests 仅仅抓取的是原始 HTML 代码。
抓取这种类型网站的页面数据,解决方案如下:

  • 分析网页源代码数据,如果数据是隐藏在 HTML 中的其他地方,以 JavaScript 变量的形式存在,直接提取就好了。
  • 分析 Ajax,很多数据可能是经过 Ajax 请求时候获取的,所以可以分析其接口。
  • 模拟JavaScript渲染过程,直接抓取渲染后的结果。

Pyppeteer爬虫就是用的第三种方法

import asyncio
from pyppeteer import launch
import random
import logging
import openpyxl
import datetime

wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(['book_info', 'price', 'comment', 'shop_name', 'link'])
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
start = datetime.datetime.now()
semaphore = asyncio.Semaphore(5)   # 设置信号量   防止一下开启过多浏览器


async def scrape_info(page):
    # 滑动到页面底部   不然刚进入页面只渲染出了30条信息  一半
    await page.evaluate('window.scrollBy(0, document.body.scrollHeight)')
    # 休眠   防止爬取过快被返回首页
    await asyncio.sleep(random.randint(2, 4))
    items = await page.xpath('//*[@id="J_goodsList"]/ul/li')
    for item in items:
        # 捕捉异常   有些没提取到数据   报list index out of range
        try:
            book_info = await item.xpath('.//div[@class="p-name p-name-type-2"]/a/em')
            book_info = await (await book_info[0].getProperty('textContent')).jsonValue()
            price = await item.xpath('.//div[@class="p-price"]/strong/i')
            price = await (await price[0].getProperty('textContent')).jsonValue()
            comment = await item.xpath('.//div[@class="p-commit"]/strong/a')
            comment = await (await comment[0].getProperty('textContent')).jsonValue()
            shop_name = await item.xpath('.//span[@class="J_im_icon"]/a')
            shop_name = await (await shop_name[0].getProperty('textContent')).jsonValue()
            link = await item.xpath('.//div[@class="p-img"]/a')
            link = await (await link[0].getProperty('href')).jsonValue()
            logging.info({'book_info': book_info, 'price': price, 'comment': comment, 'shop_name': shop_name, 'link': link})
            sheet.append([book_info, price, comment, shop_name, link])
        except Exception as e:
            logging.info(e)


async def main(i):
    # 调试好后   headless设置为True  运行不弹出浏览器界面
    async with semaphore:
        browser = await launch(
            {'headless': True}
        )
        url = f'https://search.jd.com/Search?keyword=python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&wq=python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page={pages[i]}&s={size[i]}&click=0'
        page = await browser.newPage()
        # 设置页面视图大小
        await page.setViewport(viewport={'width': 1366, 'height': 768})
        # 设置请求头
        await page.setUserAgent(
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1")
        # 超时时间  设置为6s
        await page.goto(url, options={'timeout': 6 * 1000})
        await asyncio.sleep(random.randint(1, 3))
        # 调用函数抓取数据
        await scrape_info(page)
        # 关闭浏览器
        await browser.close()


if __name__ == '__main__':
    # 构造参数
    pages = [i for i in range(1, 200) if i % 2 != 0]
    size = [i * 60 + 1 for i in range(100)]
    scrape_index_tasks = [asyncio.ensure_future(main(index)) for index in range(0, 100)]
    loop = asyncio.get_event_loop()
    tasks = asyncio.gather(*scrape_index_tasks)
    loop.run_until_complete(tasks)
    wb.save('book_info.xlsx')
    delta = (datetime.datetime.now() - start).total_seconds()
    print("用时:{:.3f}s".format(delta))
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273

运行效果如下:

 

成功实现利用Pyppeteer爬虫异步爬取100页的书籍信息保存到Excel,用时249.160s。

源码获取加群:1136192749

如有侵权联系小编删除

 

puppeteer登录网站获取页面元素 puppeteer的介绍就不说了,自己baidu/chrome吧, 在这里会放一个小小的登陆功能,涉及到输入框定位,button的点击,爬取div内的页面元素。2. defaultViewport: 窗口分辨率,如果不设置默认是8xx * 6xx,个人感觉页面内容不太友好。3. page.& 相当于find element, 寻找和匹配某元素,如果有多个则默认返回第一个。1. headless:无痕模式,如果不设置就默认是true,不会显示浏览器。ext, 获取元素的文本内容。 阅读详情

相关推荐

爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息

了解Pyppeteer爬虫的基本知识,在python中安装和使用pyppeteer,进行了简单测试,开启浏览器访问页面,模拟输入文本、点击、下拉滚动条等操作,总结了launch方法中参数的设置、禁用提示条、修改网站检测浏览器特征、开启无痕模式的方法。最后用Pyppeteer爬虫实战,实现异步爬取京东商城书籍信息。

叶庭云 成为自己的光 7278

Pyppeteer的使用——爬取京东

1.Pyppeteer优势 不用像Selenium一样配置浏览器环境 Pyppeteer加载的text()是加载完成后的HTML页面,所有数据调出: Request查看的是网页源码,内部可能有JS的调用代码不全:

weixin_44826986的博客 1412

Scrapy中使用Selenium进行网页爬取:京东图书书籍信息爬取项目实例

在本例中,我们将使用Chrome浏览器和对应的Chrome驱动程序。然后,我们定义了一个名为"JingdongSpider"的Spider类,设置了name、allowed_domains和start_urls属性。然后,我们定义了一个名为"JingdongSpider"的Spider类,设置了name、allowed_domains和start_urls属性。在Spider类的构造函数中,我们初始化了一个Chrome浏览器驱动程序,并将其保存在self.driver变量中。

2301_79366332的博客 305

【0基础学爬虫】爬虫基础之自动化工具 Pyppeteer 的使用

前两期文章中已经介绍到了 Selenium 与 Playwright 的使用方法,它们的功能都非常强大。而本期要讲的 Pyppeteer 与 Playwright 一致,都可以作为 Selenium 的替代者来使用。且与 Playwright 相比,Pyppeteer 的使用更加简单。在上上期文章中,我们介绍了 Selenium 隐藏特征的方法,其中使用到了 stealth.min.js 文件。在介绍文件的来源时我们提到了 Puppeteer,Puppeteer是一个基于 Node.js 的自动化工具。

K哥爬虫 2054

python爬虫神器Pyppeteer入门及使用

前言 提起selenium想必大家都不陌生,作为一款知名的Web自动化测试框架,selenium支持多款主流浏览器,提供了功能丰富的API接口,经常被我们用作爬虫工具来使用。但是selenium的缺点也很明显,比如速度太慢、对版本配置要求严苛,最麻烦是经常要更新对应的驱动。 今天就给大家介绍另一款web自动化测试工具Pyppeteer,虽然支持的浏览器比较单一,但在安装配置的便利性和运行效率方面都要远胜selenium。 01.Pyppeteer简介 介绍Pyppeteer之前先说一下Puppeteer,Puppeteer是谷歌出品的一款基于Node.js开发的一款工具,主要是用来操纵Chro

100多台物理GPU服务器,每台服务器上有8张GPU卡,组网

计算网用 IB/RoCEv2 保证低延迟高带宽,支撑 800+GPU 的分布式训练;管理网和存储网独立部署,避免干扰核心通信;全链路冗余和规范布线,确保集群稳定运行;搭配 Slurm/K8s 和监控工具,实现高效管理。该方案可支撑千亿参数大模型训练,且具备极强的扩展性,未来可平滑扩容至 200 + 台服务器。

weixin_42795092的博客 2022

爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息!

提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用。但是 selenium 的缺点也很明显,比如速度太慢、对版本配置要求严苛,最麻烦是经常要更新对应的驱动。还有些网页是可以检测到是否是使用了selenium 。并且selenium 所谓的保护机制不允许跨域 cookies 保存以及登录的时候必须先打开网页然后后加载 cookies 再刷新的方式很不友好。 今天给大家介绍另一款 w

爬遍所有网站 766

QQ的TEA填充算法C#实现 By Red_angelX

注:本人只是从LUMA QQ的 Source Code里面把相应Java语言翻译成C#,纯技术研究,并没有对TC产品做任何逆向分析,不承担任何法律责任!转载请保持本文完整性网上有c/c++,vb,delphi,java,perl各种版本的tea填充算法,唯独没有C#的,这让我这种狂热喜爱C#的人如何承受,于是,花3天时间看了各种代码经历无数失败的挫折终于用C#完成了该填充算法,废话不多说,直接

Red_angelX的专栏 1万+

python爬虫获取京东商城_爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息...

提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用。但是 selenium 的缺点也很明显,比如速度太慢、对版本配置要求严苛,最麻烦是经常要更新对应的驱动。还有些网页是可以检测到是否是使用了selenium 。并且selenium 所谓的保护机制不允许跨域 cookies...

weixin_39883433的博客 268

28、解码清华SSVEP基准数据集:从EEG信号到深度学习模型的实战指南

本文详细解析了清华大学SSVEP基准数据集的处理与深度学习模型构建全流程。从EEG信号预处理、数据维度变换到SSVEP分类模型设计,提供了实战代码示例和关键技巧,帮助读者掌握脑机接口领域的数据处理方法与模型优化策略。

weixin_29029995的博客 176

保姆级教程:用Qlib和LightGBM从零搭建你的第一个AI量化选股策略(附完整代码)

本文提供了一份详细的教程,教你如何使用Qlib和LightGBM从零搭建AI量化选股策略。教程涵盖了环境配置、数据获取、特征工程、模型训练和策略回测等关键步骤,并附有完整代码和常见问题解决方案,适合量化投资初学者快速上手。

weixin_29191081的博客 447

pyppeteer使用方法

要想知道什么是 Pyppeteer,首先应该先了解一下 Puppeteer:Puppeteer 是 Google 基于 Node.js 开发的一个工具,拥有 Puppeteer 即可通过 JavaScript 来控制 Chrome 浏览器的一些操作,也可以用于网络爬虫上,其 API 极其完善,功能非常强大。Pyppeteer 是 Puppeteer 的 Python 实现,Pyppetter 基于 Chromium 浏览器通过执行一些动作来进行网页渲染,Pyppeteer 基于 Python 的新特性。

qq_45444679的博客 1028

【STC32G12K128开发板】——搭建开发环境

Keil C251是美国Keil公司(该公司2005年被ARM公司收购)出品的针对251微控制器系列兼容单片机C语言软件开发系统。

qq_36139768的博客 1万+

python pyppeteer学习笔记

简介 Pyppeteer是Puppeteer的非官方Python支持,Puppeteer是一个无头JavaScript的基于Chrome/Chromium浏览器自动化库,可以用于对渲染网页的抓取。 优点 免安装chrome。第一次使用时,会自动下载安装chromium(chromium相当于chrome的开发版本)。 可直接抓取JavaScript渲染结果 安装 pip install py...

Theo仔要DeepLearning 3088

如何从RHEL 8升级到RHEL 9

Red Hat 于 2022 年 5 月 17 日宣布全面推出 RHEL 9。这是 RHEL(Red Hat Enterprise Linux)的最新版本,它具有许多功能和增强功能。

u012748257的博客 1020

2024年下半年网络规划设计师论文真题

3、深入论述自身参与的工业网络是如何实施的,为实现制造业的智能化,如何实现数据的跨系统互通,促进各种工业数据的充分流动和无缝集成以及数据安全。3、结合自身参与的网络建设,详细叙述针对该网络“去NAT”的规划和设计方案。4、在实施过程中遇到的问题以及如何处理,项目实施后的效果和评价。2、大型园区网络“去NAT”改造和业务融合的整体架构。1、“网络去NAT”对推进ipv6演进和应用的意义。4、改造过程中遇到的问题及解决方案。2、简要叙述自身参与的制造网络建设。1、网络规划在智能制造中的意义。

鹿鸣天涯 2372

使用 Pyppeteer 的 evaluateOnNewDocument 方法时出现 Object.defineProperty(...) is not a function 的解决方案

所遇问题 最近使用 Pyppeteer 过程中调用 evaluateOnNewDocument 方法在浏览器中执行 JavaScript 代码时出现了一个错误,关键代码如下: await page.evaluateOnNewDocument('Object.defineProperty(navigator, "webdriver", {get: () => undefined})') 其中 JavaScript 代码如下: Object.defineProperty(navigator, "webd

Giyn 2997

Skill的嵌套

Skill的嵌套就很简单,直接引用其他的Skill就好了。在一个 Skill 的 SKILL.md 中,可以明确指示 Claude 去读取另一个 Skill 的文档。

Criss@陈磊 963

Node 系列 - 006 - Puppeteer

在前面的 5 篇文章打底下,咱们应该接入点接地气的业务了。本篇开始将接触前端多语言功能。不知道小伙伴们有没有接触过,这一次 jsliang 将把真实的项目中对于多语言的处理(对,仅是处理而...

weixin_41806099的博客 601

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Python 爬虫——Pyppeteer

Pyppeteer相比于Selenium最大的优势是可以实现无头浏览器,它可以在不开启浏览器页面的情况下模拟浏览器进行请求的发送和接收,并且支持原生的Javascript,可以实现更多样化的页面操作。模拟用户的方式可以很好的解决直接请求的难题,一般来说获取到的页面数据都是完全渲染之后的结果,可以看到的数据都可以进行内容提取(若页面加载不完全,也可以使用某些方式使得页面完全加载)

Phantom_Blu_Ray的博客 3658

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Pyppeteer 使用笔记

Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用作网络爬虫上,其 API 极其完善,功能非常强大。 而 Pyppeteer 又是什么呢?它实际上是 Puppeteer 的 Python 版本的实现,但他不是 Google 开发的,是一位来自于日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本。 基础用法 import asyncio from pyppeteer imp

weixin_40303822的博客 1379

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

pyppeteer 爬虫

pyppeteer工作原理预备知识:协程launch的其它参数基本框架浏览器截图保存为 PDF执行 JavaScript防止被检测为自动控制工具,webdriver 检测问题恢复上次登录状态(保存cookie)获取元素xpathCSS选择器判断是否有滑块 .Jeval对相应元素输入值鼠标事件键盘事件点击登陆设置请求头等待事件拉到页面最底部获取网页源代码 工作原理 启动一个浏览器Chromium,用浏览器装入网页。浏览器可以用无头模式 (headless),即隐藏模式启动,也可以显式启动 从浏览器可以获取网

淼淼不暴躁! 2308

pyppeteer-比 selenium 更高效的爬虫利器

API 接口文档:API Reference:https://miyakogi.github.io/pyppeteer/reference.html pyppeteer github 地址:https://github.com/miyakogi/pyppeteer pyppeteer  英文文档地址:https://miyakogi.github.io/pyppeteer/ pyppeteer 官方文档 API Ref...

fulk6667g78o8的专栏 2456

pyppeteer反爬

【代码】pyppeteer反爬。

qq_45444679的博客 786
上一篇: Python编写代码来理解赢得《lol》游戏的胜利最重要因素
下一篇: 如何给pycharm换上超清壁纸,写代码的效率翻倍呀!
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值