【小白慎入】还在手动撸浏览器?教你一招分分钟自动化操作浏览器(Python进阶)_python 自动化浏览器(1)


### 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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值