嘉兴手机网站建设,微信推广软件有哪些,开发小程序要多少钱,广州建设交易中心网站大家好啊#xff0c;辣条哥又来猛货了#xff01; 小白慎入#xff01; 目录 环境安装1 测试样例2 基本配置2.0 基本参数2.1 设置窗口2.2 添加头部2.3 网页截图2.4 伪装浏览器 绕过检测2.5案例演示 触发JS2.6 boss直聘cookie反爬绕过实践2. 7滚动到页面底部 3 进阶使用4 数… 大家好啊辣条哥又来猛货了 小白慎入 目录 环境安装1 测试样例2 基本配置2.0 基本参数2.1 设置窗口2.2 添加头部2.3 网页截图2.4 伪装浏览器 绕过检测2.5案例演示 触发JS2.6 boss直聘cookie反爬绕过实践2. 7滚动到页面底部 3 进阶使用4 数据提取5 获取属性6 登录案例7 综合案例 Puppeteer 是 Google 基于 Node.js 开发的一个工具而 Pyppeteer 又是什么呢它实际上是Puppeteer 的 Python 版本的实现但它不是Google 开发的是一位来自于日本的工程师依据Puppeteer 的一些功能开发出来的非官方版本。 在 Pyppetter 中实际上它背后也是有一个类似 Chrome 浏览器的 Chromium 浏览器在执行一些动作进行网页渲染首先说下 Chrome 浏览器和 Chromium 浏览器的渊源。 总的来说两款浏览器的内核是一样的实现方式也是一样的可以认为是开发版和正式版的区别功能上基本是没有太大区别的。
环境安装
pip install pyppeteer注意 支持异步需要3.5以上的解释器
import pyppeteer
print(pyppeteer.__chromium_revision__) # 查看版本号
print(pyppeteer.executablePath()) # 查看 Chromium 存放路径
# pyppeteer-install 帮助你去安装谷歌如果无法启动需要手动改文件路径 官方网站https://miyakogi.github.io/pyppeteer/reference.html
1 测试样例
from pyppeteer import launch
import asyncio
import time
async def main():
# 启动一个浏览器
browser await launch(headlessFalse,args[--disable-infobars,--windowsize1920,1080])
# 创建一个页面
page await browser.newPage()
# 跳转到百度
await page.goto(http://www.baidu.com/)
# 输入要查询的关键字type 第一个参数是元素的selector第二个是要输入的关键字
await page.type(#kw,pyppeteer)
# 点击提交按钮 click 通过selector点击指定的元素
await page.click(#su)
time.sleep(3)
await browser.close()
asyncio.get_event_loop().run_until_complete(main())2 基本配置
2.0 基本参数
params{
# 关闭无头浏览器
headless: False,
dumpio:True, # 防止浏览器卡住
ruserDataDir:./cache-data, # 用户文件地址
args: [
--disable-infobars, # 关闭自动化提示框
--window-size1920,1080, # 窗口大小
--log-level30, # 日志保存等级 建议设置越小越好要不然生成的日志占用的空间会
很大 30为warning级别
--user-agentMozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36,
--no-sandbox, # 关闭沙盒模式
--start-maximized, # 窗口最大化模式
--proxy-serverhttp://localhost:1080 # 代理
],
}2.1 设置窗口
# UI模式 频闭警告
browser await launch(headlessFalse, args[--disable-infobars])
page await browser.newPage()
await page.setViewport({width: 1200, height: 800})2.2 添加头部
await page.setUserAgent(Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML,
like Gecko) Chrome/19.0.1084.36 Safari/536.5)2.3 网页截图
page.screenshot(pathexample.png)2.4 伪装浏览器 绕过检测
Object.defineProperty() 方法会直接在一个对象上定义一个新属性或者修改一个对象的现有属性并
返回此对象。
# 伪装
await page.evaluateOnNewDocument(() { Object.defineProperties(navigator,
{ webdriver:{ get: () false } })})
await page.goto(https://intoli.com/blog/not-possible-to-block-chromeheadless/chrome-headless-test.html)2.5案例演示 触发JS
async def run():
browser await launch()
page await browser.newPage()
await page.setViewport({width: 1200, height: 800})
await page.goto(https://www.zhipin.com/job_detail/?
query%E8%85%BE%E8%AE%AF%E7%88%AC%E8%99%ABcity101020100industryposition)
dimensions await page.evaluate(() {
return {
cookie: window.document.cookie,
}
})
print(dimensions,type(dimensions))
asyncio.get_event_loop().run_until_complete(run())2.6 boss直聘cookie反爬绕过实践
import asyncio,requests
from pyppeteer import launch
async def run():
browser await launch()
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.evaluateOnNewDocument(() { Object.defineProperties(navigator,
{ webdriver:{ get: () false } }) })
await page.goto(https://www.zhipin.com/job_detail/?
query%E8%85%BE%E8%AE%AF%E7%88%AC%E8%99%ABcity101020100industryposition)
dimensions await page.evaluate(() {
return {
cookie: window.document.cookie,
}
})
headets {
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36,
cookie: dimensions.get(cookie)
}
res requests.get(
https://www.zhipin.com/job_detail/?
query%E8%85%BE%E8%AE%AF%E7%88%AC%E8%99%ABcity101020100industryposition,
headersheadets)
print(res.text)注boss主要是cookie token反爬还有IP监测
2. 7滚动到页面底部
await page.evaluate(window.scrollBy(0, document.body.scrollHeight))接下来看看它的参数简介 ignoreHTTPSErrors (bool)是否要忽略 HTTPS 的错误默认是 False。
headless (bool)是否启用 Headless 模式即无界面模式如果devtools 这个参数是 True 的 话那么该参数就会被设置为 False否则为 True即默认是开启无界面模式的。 executablePath (str)可执行文件的路径如果指定之后就不需要使用默认的 Chromium 了可 以指定为已有的 Chrome 或 Chromium。 slowMo (int|float)通过传入指定的时间可以减缓 Pyppeteer 的一些模拟操作。 args (List[str])在执行过程中可以传入的额外参数。 ignoreDefaultArgs (bool)不使用 Pyppeteer 的默认参数如果使用了这个参数那么最好通过 args 参数来设定一些参数否则可能会出现一些意想不到的问题。这个参数相对比较危险慎用。 handleSIGINT (bool)是否响应 SIGINT 信号也就是可以使用 Ctrl C 来终止浏览器程序默认 是 True。 handleSIGTERM (bool)是否响应 SIGTERM 信号一般是 kill 命令默认是 True。 handleSIGHUP (bool)是否响应 SIGHUP 信号即挂起信号比如终端退出操作默认是 True。 dumpio (bool)是否将 Pyppeteer 的输出内容传给 process.stdout 和 process.stderr 对象默 认是 False。 userDataDir (str)即用户数据文件夹即可以保留一些个性化配置和操作记录。 env (dict)环境变量可以通过字典形式传入。 devtools (bool)是否为每一个页面自动开启调试工具默认是 False。如果这个参数设置为True那么 headless 参数就会无效会被强制设置为 False。 logLevel (int|str)日志级别默认和 root logger 对象的级别相同。 autoClose (bool)当一些命令执行完之后是否自动关闭浏览器默认是 True。 loop (asyncio.AbstractEventLoop)事件循环对象。 3 进阶使用
import asyncio
from pyppeteer import launch
from pyquery import PyQuery as pq
async def main():
browser await launch(headlessFalse) # 打开浏览器
page await browser.newPage() # 开启选项卡
# 输入地址访问页面
await page.goto(https://careers.tencent.com/search.html?keywordpython)
# 调用选折器
await page.waitForXPath(//div[classrecruit-wrap recruit-margin]/div)
# 获取网页源代码
doc pq(await page.content())
# 提取数据
title [item.text() for item in doc(.recruit-title).items()]
print(title:, title)
# 关闭浏览器
await browser.close()
# 启动异步方法
asyncio.get_event_loop().run_until_complete(main())4 数据提取
# 在页面内执行 document.querySelector。如果没有元素匹配指定选择器返回值是 None
J querySelector
# 在页面内执行 document.querySelector然后把匹配到的元素作为第一个参数传给 pageFunction
Jeval querySelectorEval
# 在页面内执行 document.querySelectorAll。如果没有元素匹配指定选择器返回值是 []
JJ querySelectorAll
# 在页面内执行 Array.from(document.querySelectorAll(selector))然后把匹配到的元素数组
作为第一个参数传给 pageFunction
JJeval querySelectorAllEval
# XPath表达式
Jx xpath
# Pyppeteer 三种解析方式
Page.querySelector() # 选择器 css 选择器
Page.querySelectorAll()
Page.xpath() # xpath 表达式
# 简写方式为
Page.J(), Page.JJ(), and Page.Jx()5 获取属性
提取目标地址https://pic.netbian.com/4kmeinv/index.html 所有的图片资源
async def mains1():
browser await launch(headlessFalse, 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.evaluateOnNewDocument(() { Object.defineProperties(navigator,
{ webdriver:{ get: () false } }) })
await page.goto(https://pic.netbian.com/4kmeinv/index.html)
elements await page.querySelectorAll(.clearfix li a img)
for item in elements:
# 获取连接
title_link await (await item.getProperty(src)).jsonValue()
print(title_link)
await browser.close()
asyncio.get_event_loop().run_until_complete(mains1())6 登录案例
import asyncio
from pyppeteer import launch
async def mains2():
browser await launch({headless: False, args: [--disable-infobars, -
-window-size1920,1080]})
page await browser.newPage()
await page.setViewport({width: 1920, height: 1080})
await page.goto(https://www.captainbi.com/amz_login.html)
await page.evaluateOnNewDocument(() { Object.defineProperties(navigator,
{ webdriver:{ get: () false } }) })
await page.type(#username, 13555553333) # 账号
await page.type(#password, 123456) # 密码
await asyncio.sleep(2)
await page.click(#submit,{timeout: 3000})
import time
# await browser.close()
print(登录成功)
asyncio.get_event_loop().run_until_complete(mains2())7 综合案例
# encoding: utf-8author: 夏洛
QQ: 1972386194
site: https://www.tulingxueyuan.cn/
file: 唯品会.pyimport requests
from lxml import etree
from loguru import logger
import pandas as pd
from utils import ua
import asyncio
from pyppeteer import launch
class Wph(object):
def __init__(self,url,name):
self.url url
self.name name
self.headers {
user-agent: ua.get_random_useragent()
}
self.session requests.session()
self.hadlnone lambda x:x[0] if x else
async def main(self,url):
global browser
browser await launch()
page await browser.newPage()
await page.goto(url)
text await page.content() # 返回页面html
return text
def spider(self):
df pd.DataFrame(columns[品牌, 标题, 原价, 现价, 折扣])
# 发起HTTP请求
# https://category.vip.com/suggest.php?
keyword%E5%8F%A3%E7%BA%A2brand_sn10000359
res self.session.get(self.url,params{keyword:self.name},headers
self.headers,verifyFalse)
html etree.HTML(res.text)
url_list html.xpath(//div[classc-filter-groupcontent]/div[contains(class,c-filter-group-scroll-brand)]/ul/li/a/href)
# 迭代品牌URL地址
for i in url_list:
ua.wait_some_time()
# 驱动浏览器 请求
page_html
asyncio.get_event_loop().run_until_complete(self.main(http: i))
# 获取网页源代码
page etree.HTML(page_html)
htmls page.xpath(//section[idJ_searchCatList]/div)
# 迭代商品URL列表
for h in htmls[1:]:
# 评判
pingpai self.hadlnone(h.xpath(//div[contains(class,cbreadcrumbs-cell-title)]/span/text()))
# 标题
title self.hadlnone(h.xpath(.//div[contains(class,cgoods-item__name)]/text()))
# 价格 原价
y_price self.hadlnone(h.xpath(.//div[contains(class,cgoods-item__market-price)]/text()))
# 卖价
x_price self.hadlnone(h.xpath(.//div[contains(class,cgoods-item__sale-price)]/text()))
# 折扣
zk self.hadlnone(h.xpath(.//div[contains(class,c-goodsitem__discount)]/text()))
logger.info(f品牌{pingpai}标题{title}原价{y_price}现价
{x_price}折扣{zk})
# 构造字典
pro {
品牌:pingpai,
标题:title,
原价:y_price,
现价:x_price,
折扣:zk
}
df df.append([pro])
df.to_excel(唯品会数据2.xlsx,indexFalse)
return df
def __del__(self):
browser.close()
if __name__ __main__:
url https://category.vip.com/suggest.php
name 香水
w Wph(url,name)
w.spider()