Pyppeteer的使用——爬取京东

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())执行异步

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值