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