pyppeteer 環(huán)境及示例

該包是puppeteer 的非官方python實(shí)現(xiàn)捧存, 可以實(shí)現(xiàn)與puppeteer類似的功能。

https://github.com/miyakogi/pyppeteer

安裝

pip install pyppeteer

下載使用 chromium

默認(rèn)下載地址為 DEFAULT_DOWNLOAD_HOST = 'https://storage.googleapis.com' , 需要FQ才可下載,下面介紹不FQ的方法瘩扼。

我使用npm 安裝了 puppeteer , 運(yùn)行時(shí)會(huì)下載chromium 启上。
npm下載的位置在F:\program_nodejs\testpuppeteer\node_modules\puppeteer\.local-chromium\win64-588429\chrome-win32 .

pyppeteer默認(rèn)會(huì)將之存放在 pyppeteer_home =C:\Users\Administrator\AppData\Local\pyppeteer\pyppeteer\ 下邢隧,
翻看pyppeteer源碼, 可以看到其存放的目錄結(jié)構(gòu)為local-chromium / REVISION / 'chrome-win32' / 'chrome.exe' , REVISION對(duì)應(yīng)上面的588429版本號(hào)冈在, 建立上述目錄倒慧,將npm下載的chromium拷貝進(jìn)去即可。

這里需要注意包券, 在運(yùn)行時(shí)需要指定chromium的版本號(hào) 纫谅, os.environ['PYPPETEER_CHROMIUM_REVISION'] ='588429'

爬取網(wǎng)頁代碼

import asyncio
import  pyppeteer
import os

os.environ['PYPPETEER_CHROMIUM_REVISION'] ='588429'
pyppeteer.DEBUG = True

async def main():
    print("in main ")
    print(os.environ.get('PYPPETEER_CHROMIUM_REVISION'))
    browser = await pyppeteer.launch()
    page = await browser.newPage()
    await page.goto('http://www.baidu.com')
    
    content = await page.content()
    cookies = await page.cookies()
    # await page.screenshot({'path': 'example.png'})
    await browser.close()
    return {'content':content, 'cookies':cookies}

loop = asyncio.get_event_loop()
task = asyncio.ensure_future(main())
loop.run_until_complete(task)

print(task.result())

注意asyncio包的使用 , 及獲取網(wǎng)頁內(nèi)容的寫法溅固。

其他api用法詳見 https://miyakogi.github.io/pyppeteer/reference.html

與scrapy的整合

加入downloadmiddleware

from scrapy import signals
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
import random
import pyppeteer
import asyncio
import os
from scrapy.http import HtmlResponse

pyppeteer.DEBUG = False 

class FundscrapyDownloaderMiddleware(object):
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.
    def __init__(self) :
        print("Init downloaderMiddleware use pypputeer.")
        os.environ['PYPPETEER_CHROMIUM_REVISION'] ='588429'
        # pyppeteer.DEBUG = False
        print(os.environ.get('PYPPETEER_CHROMIUM_REVISION'))
        loop = asyncio.get_event_loop()
        task = asyncio.ensure_future(self.getbrowser())
        loop.run_until_complete(task)

        #self.browser = task.result()
        print(self.browser)
        print(self.page)
        # self.page = await browser.newPage()
    async def getbrowser(self):
        self.browser = await pyppeteer.launch()
        self.page = await self.browser.newPage()
        # return await pyppeteer.launch()
    async def getnewpage(self): 
        return  await self.browser.newPage()

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_request(self, request, spider):
        # Called for each request that goes through the downloader
        # middleware.

        # Must either:
        # - return None: continue processing this request
        # - or return a Response object
        # - or return a Request object
        # - or raise IgnoreRequest: process_exception() methods of
        #   installed downloader middleware will be called
        loop = asyncio.get_event_loop()
        task = asyncio.ensure_future(self.usePypuppeteer(request))
        loop.run_until_complete(task)
        # return task.result()
        return HtmlResponse(url=request.url, body=task.result(), encoding="utf-8",request=request)

    async def usePypuppeteer(self, request):
        print(request.url)
        # page = await self.browser.newPage()
        await self.page.goto(request.url)
        content = await self.page.content()
        return content 

    def process_response(self, request, response, spider):
        # Called with the response returned from the downloader.

        # Must either;
        # - return a Response object
        # - return a Request object
        # - or raise IgnoreRequest
        return response

    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.

        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain
        pass

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末付秕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侍郭,更是在濱河造成了極大的恐慌询吴,老刑警劉巖掠河,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異猛计,居然都是意外死亡唠摹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門奉瘤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勾拉,“玉大人,你說我怎么就攤上這事盗温∨涸蓿” “怎么了?”我有些...
    開封第一講書人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵卖局,是天一觀的道長(zhǎng)斧蜕。 經(jīng)常有香客問我,道長(zhǎng)吼驶,這世上最難降的妖魔是什么惩激? 我笑而不...
    開封第一講書人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任店煞,我火速辦了婚禮蟹演,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顷蟀。我一直安慰自己酒请,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開白布鸣个。 她就那樣靜靜地躺著羞反,像睡著了一般。 火紅的嫁衣襯著肌膚如雪囤萤。 梳的紋絲不亂的頭發(fā)上昼窗,一...
    開封第一講書人閱讀 49,919評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音涛舍,去河邊找鬼澄惊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛富雅,可吹牛的內(nèi)容都是我干的掸驱。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼没佑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼毕贼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛤奢,我...
    開封第一講書人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤鬼癣,失蹤者是張志新(化名)和其女友劉穎陶贼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體待秃,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骇窍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锥余。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腹纳。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驱犹,靈堂內(nèi)的尸體忽然破棺而出嘲恍,到底是詐尸還是另有隱情,我是刑警寧澤雄驹,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布佃牛,位于F島的核電站,受9級(jí)特大地震影響医舆,放射性物質(zhì)發(fā)生泄漏俘侠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一蔬将、第九天 我趴在偏房一處隱蔽的房頂上張望爷速。 院中可真熱鬧,春花似錦霞怀、人聲如沸惫东。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廉沮。三九已至,卻和暖如春徐矩,著一層夾襖步出監(jiān)牢的瞬間滞时,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來泰國打工滤灯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坪稽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓力喷,卻偏偏與公主長(zhǎng)得像刽漂,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弟孟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容