### 2.3 网页截图
page.screenshot(path=‘example.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%AB&city=101020100&industry=&position=’)
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%AB&city=101020100&industry=&position=’)
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%AB&city=101020100&industry=&position=’,
headers=headets)
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(headless=False) # 打开浏览器
page = await browser.newPage() # 开启选项卡
输入地址访问页面
await page.goto(‘https://careers.tencent.com/search.html?keyword=python’)
调用选折器
await page.waitForXPath(‘//div[@class=“recruit-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(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.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-size=1920,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-8
“”"
@author: 夏洛
@QQ: 1972386194
@site: https://www.tulingxueyuan.cn/
@file: 唯品会.py
“”"
import 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%A2&brand_sn=10000359
res = self.session.get(self.url,params={‘keyword’:self.name},headers =
self.headers,verify=False)
html = etree.HTML(res.text)
url_list = html.xpath(‘//div[@class=“c-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[@id=“J_searchCatList”]/div’)
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
(4)200多本电子书
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
(5)Python知识点汇总
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
(6)其他资料
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!