成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Google推出的爬蟲(chóng)新神器:Pyppeteer,神擋殺神,佛擋殺佛!

Fundebug / 2991人閱讀

摘要:注意,是叫做,不是。兩款瀏覽器同根同源,它們有著同樣的,但配色不同,由藍(lán)紅綠黃四種顏色組成,而由不同深度的藍(lán)色構(gòu)成。另外是基于的新特性實(shí)現(xiàn)的,所以它的一些執(zhí)行也支持異步操作,效率相對(duì)于來(lái)說(shuō)也提高了。是否響應(yīng)信號(hào),一般是命令,默認(rèn)是。

如果大家對(duì) Python 爬蟲(chóng)有所了解的話,想必你應(yīng)該聽(tīng)說(shuō)過(guò) Selenium 這個(gè)庫(kù),這實(shí)際上是一個(gè)自動(dòng)化測(cè)試工具,現(xiàn)在已經(jīng)被廣泛用于網(wǎng)絡(luò)爬蟲(chóng)中來(lái)應(yīng)對(duì) JavaScript 渲染的頁(yè)面的抓取。

但 Selenium 用的時(shí)候有個(gè)麻煩事,就是環(huán)境的相關(guān)配置,得安裝好相關(guān)瀏覽器,比如 Chrome、Firefox 等等,然后還要到官方網(wǎng)站去下載對(duì)應(yīng)的驅(qū)動(dòng),最重要的還需要安裝對(duì)應(yīng)的 Python Selenium 庫(kù),確實(shí)是不是很方便,另外如果要做大規(guī)模部署的話,環(huán)境配置的一些問(wèn)題也是個(gè)頭疼的事情。

那么本節(jié)就介紹另一個(gè)類似的替代品,叫做 Pyppeteer。注意,是叫做 Pyppeteer,不是 Puppeteer。Puppeteer 是 Google 基于 Node.js 開(kāi)發(fā)的一個(gè)工具,有了它我們可以通過(guò) JavaScript 來(lái)控制 Chrome 瀏覽器的一些操作,當(dāng)然也可以用作網(wǎng)絡(luò)爬蟲(chóng)上,其 API 極其完善,功能非常強(qiáng)大。而 Pyppeteer 又是什么呢?它實(shí)際上是 Puppeteer 的 Python 版本的實(shí)現(xiàn),但他不是 Google 開(kāi)發(fā)的,是一位來(lái)自于日本的工程師依據(jù) Puppeteer 的一些功能開(kāi)發(fā)出來(lái)的非官方版本。

在 Pyppetter 中,實(shí)際上它背后也是有一個(gè)類似 Chrome 瀏覽器的 Chromium 瀏覽器在執(zhí)行一些動(dòng)作進(jìn)行網(wǎng)頁(yè)渲染,首先說(shuō)下 Chrome 瀏覽器和 Chromium 瀏覽器的淵源。

Chromium 是谷歌為了研發(fā) Chrome 而啟動(dòng)的項(xiàng)目,是完全開(kāi)源的。二者基于相同的源代碼構(gòu)建,Chrome 所有的新功能都會(huì)先在 Chromium 上實(shí)現(xiàn),待驗(yàn)證穩(wěn)定后才會(huì)移植,因此 Chromium 的版本更新頻率更高,也會(huì)包含很多新的功能,但作為一款獨(dú)立的瀏覽器,Chromium 的用戶群體要小眾得多。兩款瀏覽器“同根同源”,它們有著同樣的 Logo,但配色不同,Chrome 由藍(lán)紅綠黃四種顏色組成,而 Chromium 由不同深度的藍(lán)色構(gòu)成。

總的來(lái)說(shuō),兩款瀏覽器的內(nèi)核是一樣的,實(shí)現(xiàn)方式也是一樣的,可以認(rèn)為是開(kāi)發(fā)版和正式版的區(qū)別,功能上基本是沒(méi)有太大區(qū)別的。

Pyppeteer 就是依賴于 Chromium 這個(gè)瀏覽器來(lái)運(yùn)行的。那么有了 Pyppeteer 之后,我們就可以免去那些繁瑣的環(huán)境配置等問(wèn)題。如果第一次運(yùn)行的時(shí)候,Chromium 瀏覽器沒(méi)有安全,那么程序會(huì)幫我們自動(dòng)安裝和配置,就免去了繁瑣的環(huán)境配置等工作。另外 Pyppeteer 是基于 Python 的新特性 async 實(shí)現(xiàn)的,所以它的一些執(zhí)行也支持異步操作,效率相對(duì)于 Selenium 來(lái)說(shuō)也提高了。

那么下面就讓我們來(lái)一起了解下 Pyppeteer 的相關(guān)用法吧。

安裝

首先就是安裝問(wèn)題了,由于 Pyppeteer 采用了 Python 的 async 機(jī)制,所以其運(yùn)行要求的 Python 版本為 3.5 及以上。

安裝方式非常簡(jiǎn)單:

pip3?install?pyppeteer

好了,安裝完成之后我們命令行下測(cè)試下:

>>>?import?pyppeteer

如果沒(méi)有報(bào)錯(cuò),那么就證明安裝成功了。

快速上手

接下來(lái)我們測(cè)試下基本的頁(yè)面渲染操作,這里我們選用的網(wǎng)址為:http://quotes.toscrape.com/js/,這個(gè)頁(yè)面是 JavaScript 渲染而成的,用基本的 requests 庫(kù)請(qǐng)求得到的 HTML 結(jié)果里面是不包含頁(yè)面中所見(jiàn)的條目?jī)?nèi)容的。

為了證明 requests 無(wú)法完成正常的抓取,我們可以先用如下代碼來(lái)測(cè)試一下:

import requests
from pyquery import PyQuery as pq

url = "http://quotes.toscrape.com/js/"
response = requests.get(url)
doc = pq(response.text)
print("Quotes:", doc(".quote").length)

這里首先使用 requests 來(lái)請(qǐng)求網(wǎng)頁(yè)內(nèi)容,然后使用 pyquery 來(lái)解析頁(yè)面中的每一個(gè)條目。觀察源碼之后我們發(fā)現(xiàn)每個(gè)條目的 class 名為 quote,所以這里選用了 .quote 這個(gè) CSS 選擇器來(lái)選擇,最后輸出條目數(shù)量。

運(yùn)行結(jié)果:

Quotes:?0

結(jié)果是 0,這就證明使用 requests 是無(wú)法正常抓取到相關(guān)數(shù)據(jù)的。因?yàn)槭裁??因?yàn)檫@個(gè)頁(yè)面是 JavaScript 渲染而成的,我們所看到的內(nèi)容都是網(wǎng)頁(yè)加載后又執(zhí)行了 JavaScript 之后才呈現(xiàn)出來(lái)的,因此這些條目數(shù)據(jù)并不存在于原始 HTML 代碼中,而 requests 僅僅抓取的是原始 HTML 代碼。

好的,所以遇到這種類型的網(wǎng)站我們應(yīng)該怎么辦呢?

其實(shí)答案有很多:

分析網(wǎng)頁(yè)源代碼數(shù)據(jù),如果數(shù)據(jù)是隱藏在 HTML 中的其他地方,以 JavaScript 變量的形式存在,直接提取就好了。

分析 Ajax,很多數(shù)據(jù)可能是經(jīng)過(guò) Ajax 請(qǐng)求時(shí)候獲取的,所以可以分析其接口。

模擬 JavaScript 渲染過(guò)程,直接抓取渲染后的結(jié)果。

而 Pyppeteer 和 Selenium 就是用的第三種方法,下面我們?cè)儆?Pyppeteer 來(lái)試試,如果用 Pyppeteer 實(shí)現(xiàn)如上頁(yè)面的抓取的話,代碼就可以寫為如下形式:

import asyncio
from pyppeteer import launch
from pyquery import PyQuery as pq

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto("http://quotes.toscrape.com/js/")
    doc = pq(await page.content())
    print("Quotes:", doc(".quote").length)
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

運(yùn)行結(jié)果:

Quotes:?10

看運(yùn)行結(jié)果,這說(shuō)明我們就成功匹配出來(lái)了 class 為 quote 的條目,總數(shù)為 10 條,具體的內(nèi)容可以進(jìn)一步使用 pyquery 解析查看。

那么這里面的過(guò)程發(fā)生了什么?

實(shí)際上,Pyppeteer 整個(gè)流程就完成了瀏覽器的開(kāi)啟、新建頁(yè)面、頁(yè)面加載等操作。另外 Pyppeteer 里面進(jìn)行了異步操作,所以需要配合 async/await 關(guān)鍵詞來(lái)實(shí)現(xiàn)。

首先, launch 方法會(huì)新建一個(gè) Browser 對(duì)象,然后賦值給 browser,然后調(diào)用 newPage ?方法相當(dāng)于瀏覽器中新建了一個(gè)選項(xiàng)卡,同時(shí)新建了一個(gè) Page 對(duì)象。然后 Page 對(duì)象調(diào)用了 goto 方法就相當(dāng)于在瀏覽器中輸入了這個(gè) URL,瀏覽器跳轉(zhuǎn)到了對(duì)應(yīng)的頁(yè)面進(jìn)行加載,加載完成之后再調(diào)用 content 方法,返回當(dāng)前瀏覽器頁(yè)面的源代碼。然后進(jìn)一步地,我們用 pyquery 進(jìn)行同樣地解析,就可以得到 JavaScript 渲染的結(jié)果了。

另外其他的一些方法如調(diào)用 asyncio 的 get_event_loop 等方法的相關(guān)操作則屬于 Python 異步 async 相關(guān)的內(nèi)容了,大家如果不熟悉可以了解下 Python 的 async/await 的相關(guān)知識(shí)。

好,通過(guò)上面的代碼,我們就可以完成 JavaScript 渲染頁(yè)面的爬取了。

在這個(gè)過(guò)程中,我們沒(méi)有配置 Chrome 瀏覽器,沒(méi)有配置瀏覽器驅(qū)動(dòng),免去了一些繁瑣的步驟,同樣達(dá)到了 Selenium 的效果,還實(shí)現(xiàn)了異步抓取,爽歪歪!

接下來(lái)我們?cè)倏纯戳硗庖粋€(gè)例子,這個(gè)例子可以模擬網(wǎng)頁(yè)截圖,保存 PDF,另外還可以執(zhí)行自定義的 JavaScript 獲得特定的內(nèi)容,代碼如下:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto("http://quotes.toscrape.com/js/")
    await page.screenshot(path="example.png")
    await page.pdf(path="example.pdf")
    dimensions = await page.evaluate("""() => {
        return {
            width: document.documentElement.clientWidth,
            height: document.documentElement.clientHeight,
            deviceScaleFactor: window.devicePixelRatio,
        }
    }""")

    print(dimensions)
    # >>> {"width": 800, "height": 600, "deviceScaleFactor": 1}
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

這里我們又用到了幾個(gè)新的 API,完成了網(wǎng)頁(yè)截圖保存、網(wǎng)頁(yè)導(dǎo)出 PDF 保存、執(zhí)行 JavaScript 并返回對(duì)應(yīng)數(shù)據(jù)。

首先 screenshot 方法可以傳入保存的圖片路徑,另外還可以指定保存格式 type、清晰度 quality、是否全屏 fullPage、裁切 clip 等各個(gè)參數(shù)實(shí)現(xiàn)截圖。

截圖的樣例如下:

可以看到它返回的就是 JavaScript 渲染后的頁(yè)面。

pdf 方法也是類似的,只不過(guò)頁(yè)面保存格式不一樣,最后得到一個(gè)多頁(yè)的 pdf 文件,樣例如下:

可見(jiàn)其內(nèi)容也是 JavaScript 渲染后的內(nèi)容,另外這個(gè)方法還可以指定放縮大小 scale、頁(yè)碼范圍 pageRanges、寬高 width 和 height、方向 landscape 等等參數(shù),導(dǎo)出定制化的 pdf 用這個(gè)方法就十分方便。

最后我們又調(diào)用了 evaluate 方法執(zhí)行了一些 JavaScript,JavaScript 傳入的是一個(gè)函數(shù),使用 return 方法返回了網(wǎng)頁(yè)的寬高、像素大小比率三個(gè)值,最后得到的是一個(gè) JSON 格式的對(duì)象,內(nèi)容如下:

{"width":?800,?"height":?600,?"deviceScaleFactor":?1}

OK,實(shí)例就先感受到這里,還有太多太多的功能還沒(méi)提及。

總之利用 Pyppeteer 我們可以控制瀏覽器執(zhí)行幾乎所有動(dòng)作,想要的操作和功能基本都可以實(shí)現(xiàn),用它來(lái)自由地控制爬蟲(chóng)當(dāng)然就不在話下了。

詳細(xì)用法

了解了基本的實(shí)例之后,我們?cè)賮?lái)梳理一下 Pyppeteer 的一些基本和常用操作。Pyppeteer 的幾乎所有功能都能在其官方文檔的 API Reference 里面找到,鏈接為:https://miyakogi.github.io/py...,用到哪個(gè)方法就來(lái)這里查詢就好了,參數(shù)不必死記硬背,即用即查就好。

開(kāi)啟瀏覽器

使用 Pyppeteer 的第一步便是啟動(dòng)瀏覽器,首先我們看下怎樣啟動(dòng)一個(gè)瀏覽器,其實(shí)就相當(dāng)于我們點(diǎn)擊桌面上的瀏覽器圖標(biāo)一樣,把它開(kāi)起來(lái)。用 Pyppeteer 完成同樣的操作,只需要調(diào)用 launch 方法即可。

我們先看下 launch 方法的 API,鏈接為:

https://miyakogi.github.io/py...,

其方法定義如下:

pyppeteer.launcher.launch(options:?dict?=?None,?**kwargs)?→?pyppeteer.browser.Browser

可以看到它處于 launcher 模塊中,參數(shù)沒(méi)有在聲明中特別指定,返回類型是 browser 模塊中的 Browser 對(duì)象,另外觀察源碼發(fā)現(xiàn)這是一個(gè) async 修飾的方法,所以調(diào)用它的時(shí)候需要使用 await。

接下來(lái)看看它的參數(shù):

ignoreHTTPSErrors (bool): 是否要忽略 HTTPS 的錯(cuò)誤,默認(rèn)是 False。

headless (bool): 是否啟用 Headless 模式,即無(wú)界面模式,如果 devtools 這個(gè)參數(shù)是 True 的話,那么該參數(shù)就會(huì)被設(shè)置為 False,否則為 True,即默認(rèn)是開(kāi)啟無(wú)界面模式的。

executablePath (str): 可執(zhí)行文件的路徑,如果指定之后就不需要使用默認(rèn)的 Chromium 了,可以指定為已有的 Chrome 或 Chromium。

slowMo (int|float): 通過(guò)傳入指定的時(shí)間,可以減緩 Pyppeteer 的一些模擬操作。

args (List[str]): 在執(zhí)行過(guò)程中可以傳入的額外參數(shù)。

ignoreDefaultArgs (bool): 不使用 Pyppeteer 的默認(rèn)參數(shù),如果使用了這個(gè)參數(shù),那么最好通過(guò) args 參數(shù)來(lái)設(shè)定一些參數(shù),否則可能會(huì)出現(xiàn)一些意想不到的問(wèn)題。這個(gè)參數(shù)相對(duì)比較危險(xiǎn),慎用。

handleSIGINT (bool): 是否響應(yīng) SIGINT 信號(hào),也就是可以使用 Ctrl + C 來(lái)終止瀏覽器程序,默認(rèn)是 True。

handleSIGTERM (bool): 是否響應(yīng) SIGTERM 信號(hào),一般是 kill 命令,默認(rèn)是 True。

handleSIGHUP (bool): 是否響應(yīng) SIGHUP 信號(hào),即掛起信號(hào),比如終端退出操作,默認(rèn)是 True。

dumpio (bool): 是否將 Pyppeteer 的輸出內(nèi)容傳給 process.stdout 和 process.stderr 對(duì)象,默認(rèn)是 False。

userDataDir (str): 即用戶數(shù)據(jù)文件夾,即可以保留一些個(gè)性化配置和操作記錄。

env (dict): 環(huán)境變量,可以通過(guò)字典形式傳入。

devtools (bool): 是否為每一個(gè)頁(yè)面自動(dòng)開(kāi)啟調(diào)試工具,默認(rèn)是 False。如果這個(gè)參數(shù)設(shè)置為 True,那么 headless 參數(shù)就會(huì)無(wú)效,會(huì)被強(qiáng)制設(shè)置為 False。

logLevel ?(int|str): 日志級(jí)別,默認(rèn)和 root logger 對(duì)象的級(jí)別相同。

autoClose (bool): 當(dāng)一些命令執(zhí)行完之后,是否自動(dòng)關(guān)閉瀏覽器,默認(rèn)是 True。

loop (asyncio.AbstractEventLoop): 時(shí)間循環(huán)對(duì)象。

好了,知道這些參數(shù)之后,我們可以先試試看。

首先可以試用下最常用的參數(shù) headless,如果我們將它設(shè)置為 True 或者默認(rèn)不設(shè)置它,在啟動(dòng)的時(shí)候我們是看不到任何界面的,如果把它設(shè)置為 False,那么在啟動(dòng)的時(shí)候就可以看到界面了,一般我們?cè)谡{(diào)試的時(shí)候會(huì)把它設(shè)置為 False,在生產(chǎn)環(huán)境上就可以設(shè)置為 True,我們先嘗試一下關(guān)閉 headless 模式:

import asyncio
from pyppeteer import launch

async def main():
    await launch(headless=False)
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

運(yùn)行之后看不到任何控制臺(tái)輸出,但是這時(shí)候就會(huì)出現(xiàn)一個(gè)空白的 Chromium 界面了:

關(guān)閉 Headless 模式之后的界面

但是可以看到這就是一個(gè)光禿禿的瀏覽器而已,看一下相關(guān)信息:

看到了,這就是 Chromium,上面還寫了開(kāi)發(fā)者內(nèi)部版本,可以認(rèn)為是開(kāi)發(fā)版的 Chrome 瀏覽器就好。

另外我們還可以開(kāi)啟調(diào)試模式,比如在寫爬蟲(chóng)的時(shí)候會(huì)經(jīng)常需要分析網(wǎng)頁(yè)結(jié)構(gòu)還有網(wǎng)絡(luò)請(qǐng)求,所以開(kāi)啟調(diào)試工具還是很有必要的,我們可以將 devtools 參數(shù)設(shè)置為 True,這樣每開(kāi)啟一個(gè)界面就會(huì)彈出一個(gè)調(diào)試窗口,非常方便,示例如下:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch(devtools=True)
    page = await browser.newPage()
    await page.goto("https://www.baidu.com")
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

剛才說(shuō)過(guò) devtools 這個(gè)參數(shù)如果設(shè)置為了 True,那么 headless 就會(huì)被關(guān)閉了,界面始終會(huì)顯現(xiàn)出來(lái)。在這里我們新建了一個(gè)頁(yè)面,打開(kāi)了百度,界面運(yùn)行效果如下:

這時(shí)候我們可以看到上面的一條提示:"Chrome 正受到自動(dòng)測(cè)試軟件的控制",這個(gè)提示條有點(diǎn)煩,那咋關(guān)閉呢?這時(shí)候就需要用到 args 參數(shù)了,禁用操作如下:

browser?=?await?launch(headless=False,?args=["--disable-infobars"])

這里就不再寫完整代碼了,就是在 launch 方法中,args 參數(shù)通過(guò) list 形式傳入即可,這里使用的是 --disable-infobars 的參數(shù)。

另外有人就說(shuō)了,這里你只是把提示關(guān)閉了,有些網(wǎng)站還是會(huì)檢測(cè)到是 webdriver 吧,比如淘寶檢測(cè)到是 webdriver 就會(huì)禁止登錄了,我們可以試試:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.goto("https://www.taobao.com")
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

運(yùn)行時(shí)候進(jìn)行一下登錄,然后就會(huì)彈出滑塊,自己手動(dòng)拖動(dòng)一下,然后就報(bào)錯(cuò)了,界面如下:

淘寶登錄失敗<

爬蟲(chóng)的時(shí)候看到這界面是很讓人崩潰的吧,而且這時(shí)候我們還發(fā)現(xiàn)了頁(yè)面的 bug,整個(gè)瀏覽器窗口比顯示的內(nèi)容窗口要大,這個(gè)是某些頁(yè)面會(huì)出現(xiàn)的情況,讓人看起來(lái)很不爽。

我們可以先解決一下這個(gè)顯示的 bug,需要設(shè)置下 window-size 還有 viewport,代碼如下:

import asyncio
from pyppeteer import launch

width, height = 1366, 768

async def main():
    browser = await launch(headless=False,
                           args=[f"--window-size={width},{height}"])
    page = await browser.newPage()
    await page.setViewport({"width": width, "height": height})
    await page.goto("https://www.taobao.com")
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

這樣整個(gè)界面就正常了:

正常的界面

OK,那剛才所說(shuō)的 webdriver 檢測(cè)問(wèn)題怎樣來(lái)解決呢?其實(shí)淘寶主要通過(guò)

window.navigator.webdriver 來(lái)對(duì) webdriver 進(jìn)行檢測(cè),所以我們只需要使用 JavaScript 將它設(shè)置為 false 即可,代碼如下:

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch(headless=False, args=["--disable-infobars"])
    page = await browser.newPage()
    await page.goto("https://login.taobao.com/member/login.jhtml?redirectURL=https://www.taobao.com/")
    await page.evaluate(
        """() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }""")
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

這里沒(méi)加輸入用戶名密碼的代碼,當(dāng)然后面可以自行添加,下面打開(kāi)之后,我們點(diǎn)擊輸入用戶名密碼,然后這時(shí)候會(huì)出現(xiàn)一個(gè)滑動(dòng)條,這里滑動(dòng)的話,就可以通過(guò)了,如圖所示:

淘寶滑動(dòng)條驗(yàn)證通過(guò)

OK,這樣的話我們就成功規(guī)避了 webdriver 的檢測(cè),使用鼠標(biāo)拖動(dòng)模擬就可以完成淘寶的登錄了。

還有另一種方法可以進(jìn)一步免去淘寶登錄的煩惱,那就是設(shè)置用戶目錄。平時(shí)我們已經(jīng)注意到,當(dāng)我們登錄淘寶之后,如果下次再次打開(kāi)瀏覽器發(fā)現(xiàn)還是登錄的狀態(tài)。這是因?yàn)樘詫毜囊恍╆P(guān)鍵 Cookies 已經(jīng)保存到本地了,下次登錄的時(shí)候可以直接讀取并保持登錄狀態(tài)。

那么這些信息保存在哪里了呢?其實(shí)就是保存在用戶目錄下了,里面不僅包含了瀏覽器的基本配置信息,還有一些 Cache、Cookies 等各種信息都在里面,如果我們能在瀏覽器啟動(dòng)的時(shí)候讀取這些信息,那么啟動(dòng)的時(shí)候就可以恢復(fù)一些歷史記錄甚至一些登錄狀態(tài)信息了。

這也就解決了一個(gè)問(wèn)題:很多朋友在每次啟動(dòng) Selenium 或 Pyppeteer 的時(shí)候總是是一個(gè)全新的瀏覽器,那就是沒(méi)有設(shè)置用戶目錄,如果設(shè)置了它,每次打開(kāi)就不再是一個(gè)全新的瀏覽器了,它可以恢復(fù)之前的歷史記錄,也可以恢復(fù)很多網(wǎng)站的登錄信息。

那么這個(gè)怎么來(lái)做呢?很簡(jiǎn)單,在啟動(dòng)的時(shí)候設(shè)置 userDataDir 就好了,示例如下:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch(headless=False, userDataDir="./userdata", args=["--disable-infobars"])
    page = await browser.newPage()
    await page.goto("https://www.taobao.com")
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

好,這里就是加了一個(gè) userDataDir 的屬性,值為 userdata,即當(dāng)前目錄的 userdata 文件夾。我們可以首先運(yùn)行一下,然后登錄一次淘寶,這時(shí)候我們同時(shí)可以觀察到在當(dāng)前運(yùn)行目錄下又多了一個(gè) userdata 的文件夾,里面的結(jié)構(gòu)是這樣子的:

用戶文件夾

再次運(yùn)行上面的代碼,這時(shí)候可以發(fā)現(xiàn)現(xiàn)在就已經(jīng)是登錄狀態(tài)了,不需要再次登錄了,這樣就成功跳過(guò)了登錄的流程。當(dāng)然可能時(shí)間太久了,Cookies 都過(guò)期了,那還是需要登錄的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43926.html

相關(guān)文章

  • 【萬(wàn)人千題】大學(xué)生算法社區(qū)火爆開(kāi)啟,每日打卡學(xué)習(xí),誠(chéng)邀妳加入

    摘要:三結(jié)對(duì)編程排位賽四個(gè)人為一組,由隊(duì)長(zhǎng)帶隊(duì)刷題,每周根據(jù)這周四個(gè)人的刷題總數(shù)進(jìn)行隊(duì)伍間排名。萬(wàn)人千題結(jié)對(duì)編程排位賽如果想?yún)⒓拥牡诙诘耐瑢W(xué),可以先聯(lián)系作者加群,看看第一期的同袍是如何奮斗的。 ...

    morgan 評(píng)論0 收藏0
  • 重拾css(4)——樣式來(lái)源與層疊規(guī)則

    摘要:摘自設(shè)計(jì)指南樣式來(lái)源上文中提到,之所以有層疊的概念,是因?yàn)橛卸鄠€(gè)樣式來(lái)源。優(yōu)先級(jí)相同條件下例如都來(lái)自引用樣式,覆蓋的默認(rèn)規(guī)則是后者覆蓋前者,但是有一個(gè)特殊情況,其實(shí)優(yōu)先級(jí)最高。 這一節(jié)就開(kāi)始實(shí)踐上一節(jié)的思路! 1.層疊的概念 簡(jiǎn)言之,層疊就是瀏覽器對(duì)多個(gè)樣式來(lái)源進(jìn)行疊加,最終確定結(jié)果的過(guò)程。舉一個(gè)簡(jiǎn)單的例子: showImg(https://segmentfault.com/img/b...

    gityuan 評(píng)論0 收藏0
  • Python爬蟲(chóng)神器pyppeteer,對(duì) js 加密降維打擊

    摘要:爬蟲(chóng)神器,對(duì)加密降維打擊是對(duì)無(wú)頭瀏覽器的封裝。使用等其他無(wú)頭瀏覽器的最大優(yōu)勢(shì)當(dāng)然是對(duì)加密實(shí)行降維打擊,完全無(wú)視加密手段,對(duì)于一些需要登錄的應(yīng)用,也可以模擬點(diǎn)擊然后保存。請(qǐng)求過(guò)濾你的那一段頁(yè)面自動(dòng)下拉腳本 爬蟲(chóng)神器pyppeteer,對(duì) js 加密降維打擊 pyppeteer?是對(duì)無(wú)頭瀏覽器?puppeteer的 Python 封裝。無(wú)頭瀏覽器廣泛用于自動(dòng)化測(cè)試,同時(shí)也是一種很好地爬蟲(chóng)思...

    Karuru 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<