Pyppeteer的使用——爬取京东

2023-11-07

1.Pyppeteer优势

  • 不用像Selenium一样配置浏览器环境
  • 可以直接在页面上进行爬取,爬取的不是页面源码而是已经加载完毕的,显示在浏览器上的页面
  • 可以绕过加密系统

Pyppeteer加载的text()是加载完成后的HTML页面,所有数据调出,Pyppeteer获取的是加载完成的网页数据:
在这里插入图片描述
Request查看的是网页源码,内部可能有JS的调用或者Ajax接口导致代码不全:
在这里插入图片描述

2.爬取京东数据

安装:pip install pyppeteer
爬取思路:
1.观察京东页面
2.在搜索框中输入 “耳机”,点击搜索
3.抓取前三页的数据
4.实现翻页

总代码:

import asyncio	# 协程
from pyppeteer import launch
from pyppeteer_stealth import stealth

width, height = 1366, 768

async  def main():
    browser = await launch(headless=False)
    page = await browser.newPage()  # 新建标签页
    await stealth(page)  # 消除指纹
    # 设置窗口大小
    await page.setViewport({'width': width, 'height': height})
    await page.goto('https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_c40b68367c9e42489ad40ec69c3a693a')  # 前往目标网页
    # 等待页面完全加载
    await asyncio.sleep(2)
    # 定位搜索框,搜索框id=key
    await page.waitForSelector('#key', {'timeout': 9000})
    # 搜索框填写
    await page.type('#key', '耳机')
    await asyncio.sleep(1)  # 等待1s
    # 点击 按钮的class为button
    await page.click('.button')
    await asyncio.sleep(2)
    # 翻页
    for num in range(3):
        # 滚动浏览器滚动条至底部
        await page.evaluate('window.scrollBy(100, document.body.scrollHeight)')
        await asyncio.sleep(1)
        # 滑动两次提取更多数据
        await page.evaluate('window.scrollBy(200, document.body.scrollHeight)')
        # //*[@id="J_goodsList"]/ul/li[1] 商品Xpath
        li_list = await page.xpath('//*[@id="J_goodsList"]/ul/li')
        print(len(li_list))
        for i in li_list:
            # ./div/div[4]/a/em
            a = await i.xpath('./div/div[4]/a/em')
            print(a)
            # 获取数据
            title = await (await a[0].getProperty("textContent")).jsonValue()
            print(title)
        # 下一页按钮class是pn-next
        await asyncio.sleep(1)
        await page.click('.pn-next')
        print('*'*20)
    await asyncio.sleep(100)

# 执行异步
asyncio.get_event_loop().run_until_complete(main())

代码讲解:
1.browser = await launch(headless=False) 打开浏览器
headless=True——无头模式,无法看见浏览器爬取过程
headless=False——可视化,可以在页面中看见浏览器

2.page = await browser.newPage() 新建标签页
3.await stealth(page)消除指纹

浏览器指纹:
你的浏览器具有非常独特的指纹,那么当你第一次访问某网站的时候,网站会在服务器端记录下你的浏览器指纹,并且会记录你在该网站的行为;
下次你再去访问的时候,网站服务器再次读取浏览器指纹,然后跟之前存储的指纹进行比对,就知道你是否曾经来过,并且知道你上次访问期间干了些什么。
——————————————————————————————————
浏览器指纹威胁:
浏览器指纹”无需在客户端保存任何信息,不会被用户发觉,用户也无法清除(换句话说:你甚至无法判断你访问的网站到底有没有收集浏览器指纹)会被追踪

4.await page.setViewport({'width': width, 'height': height})设计窗口大小
5.await page.goto('url')前往目标页面
6.await asyncio.sleep(2)暂停两秒,等待页面加载
7.await page.waitForSelector('#key', {'timeout': 9000})定位目标元素
参数一:#name 定位 class=name 的元素;.name 定位 id=name 的元素
参数二:**{‘timeout’: 9000}**字典,定位目标元素等待的时间9s
8.await page.type('#key', '耳机') 定位完元素后,在元素中填入字符
9.await page.click('.button')点击事件
10.await page.evaluate('window.scrollBy(100, document.body.scrollHeight)')页面滑动事件,滑动多少调改变数字便可
11.await page.xpath('//*[@id="J_goodsList"]/ul/li')获取数据,获取到的是Json数据
如下:

[<pyppeteer.element_handle.ElementHandle object at 0x0000025D69BB9460>]

12.await (await a[0].getProperty("textContent")).jsonValue()获取数据
13.asyncio.get_event_loop().run_until_complete(main())执行异步

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pyppeteer的使用——爬取京东 的相关文章

随机推荐

  • Spring Boot(一):开始使用

    背景 其实Spring Boot很早就使用过 但由于之前未做深入的研究且目前工作中所使用的技术也并未涉及 所以导致对其使用依然不是很熟悉 正是因为用过Spring Boot才懂得它的好用之处 但目前开发的项目使用的技术较为落后 导致开发效率
  • 探究:秒杀系统

    1 秒杀系统的特点 瞬时高并发 2 预防措施 2 1 流量限制 对于一个相同的用户 限制请求的频次 对于一个相同的IP 限制请求的频次 验证码 减缓用户请求的次数 活动开启之前 按钮先置灰 防止无效的请求流入系统 给系统造成冲击 2 2 页
  • LOL-v2数据集和VE-LOL数据集的区别

    LOL v2数据集和VE LOL数据集的区别 LOL v2 LOL v2数据集 64 包括两个不同的子集 即LOL v2 real和LOL v2 synthetic LOL v2 real子集是通过改变ISO和曝光时间在真实场景中捕获的 包
  • git merge&rebase区别

    merge rebase两个分支合并操作 各有利弊 我们先看看表现吧 假如master和feature分支如下 如果我们merge操作 我们看到 合并时候 作为一个新提交作为一个新节点 head指针移动到最新master分支 feature
  • linux定时执行php脚本方法

    网站运营过程中 经常会遇到需要定时执行php脚本的情况 这次介绍linux系统定时执行php脚本方法 crontab crontab的服务进程名为crond 英文意为周期任务 crontab在Linux主要用于周期定时任务管理 通常安装操作
  • 胡立阳:如何判断股价见底

    胡立阳 如何判断股价见底 发表时间 2007年11月28日 17时56分 评论 浏览 248 213844 腾讯证券 最近A股指数在6100点一路下滑 跌破半年线 国内各个媒体众说纷纭 观点不一 都在判断底部到底在哪里 就此问题 腾讯证券连
  • AntD的Table表头title加Icon图标和气泡提示Tooltip

    如图 想在Table表单中的描述后面加上Icon图标和气泡提示Tooltip 第一时间找了AntD文档 找到搜索功能及相应图标 filterDropdown和filterIcon 也在百度上找到https www jianshu com p
  • QT基础(入门)

    对QT文件中的 pro文件解释 QT core gui QT包含的模块 QT中的快捷键 注释 ctr 运行 ctrl r 编译 ctrl b 查找 ctrl f 整行移动 ctrl shift 向上键 向下键 帮助文档 F1 自动对齐 ct
  • Android Studio NDK JNI 编程最小白最简单入门Demo

    Android Studio 编写JNI有两种方式 通过ndk build编写 和eclipse类似 需要配置Android mk Application mk文件 之前的一些开源库还是使用此种方式编写 so 因此还是需要了解此种方式 通过
  • C++拷贝构造函数详解

    一 什么是拷贝构造函数 首先对于普通类型的对象来说 它们之间的复制是很简单的 例如 int a 100 int b a 而类对象与普通对象不同 类对象内部结构一般较为复杂 存在各种成员变量 下面看一个类对象拷贝的简单例子 include
  • Qlik Sense Desktop 初步体验

    点击进入 QlikView QlikSense 社区 交流群 432998033 Qlik Sense Desktop 的案例展示 先上几个刚刚边看边学完成的几个报表案例效果 如果图片显示不正常 可以重新刷新一下页面显示 个人感觉报表的设计
  • C语言扫雷游戏

    一 思路 设计两个二维数组 mine和show mine用来存放布置雷的信息 show用来存放排查雷的信息 mine数组初始化为 0 布置雷时改为 1 show数组初始化为 排除雷后改为数字字符 周围有几个雷就为数字几 二 game函数 先
  • 【Spring

    应用上下文 应用上下文和资源路径 构造应用上下文 构造ClassPathXmlApplicationContext实例 快捷方式 使用通配符 蚂蚁式图案 类路径 前缀 应用上下文和资源路径 本节介绍如何使用资源创建应用程序上下文 包括使用
  • 线程的生命周期

    线程的生命周期
  • opencv将16位灰度图片转化为8位

    大家在加载灰度图时 一定要看准图片存储格式位数 opencv默认为8位读取 如果该图为16位 则读取为全0 导致程序出错 以下代码只需修改路径 可以批量处理图片 include
  • 手机相关公开数据集分享

    可用于手机价格预测 图像分类等训练 1 Flipkart 手机数据集 按品牌列出的手机规格 Apple Samsung 等 该数据集包含印度最受欢迎的 5 个移动品牌的描述 列 有 16 列 每列都有一个不言自明的标题 行 有 430 行
  • python爬虫二十一:app移动端数据抓取(一)

    1 移动端app数据 1 1为什么要抓取移动端数据 随着时代的发展 pc gt 移动端 gt 大数据 gt AI 人工智能未来 对于做数据分析 用户画像 市场调研来说仅仅参考PC端的数据是远远不够的 那么于此同时移动的数据就显得尤为的重要
  • 【WSL】WSL/WSL2安装

    WSL安装 参考 microsoft官网教程 WSL安装 系统要求 WSL WSL2的安装 Linux发行版WSL版本选择 安装linux发行版 WSL移动到其他磁盘 系统要求 必须运行 Windows 10 版本 2004 及更高版本 内
  • 软件测试——基础理论知识你都不一定看得懂

    目录 前言 软件测试 Software Testing 的定义 软件测试的分类 软件测试的常用种类 测试用例八大设计方法 结语 前言 入软件测试这一行至今已经10年多 承蒙领导们的照顾与重用 同事的支持与信任 我的职业发展算是相对较好 从入
  • Pyppeteer的使用——爬取京东

    1 Pyppeteer优势 不用像Selenium一样配置浏览器环境 可以直接在页面上进行爬取 爬取的不是页面源码而是已经加载完毕的 显示在浏览器上的页面 可以绕过加密系统 Pyppeteer加载的text 是加载完成后的HTML页面 所有