pyppeteerを使用して基本モジュール

pyppeteerを使用して基本モジュール

入門

セレンは面倒がある場合に、使用されているなどのクロム、Firefoxの、などのブラウザでは、良好な相関関係がインストールされた、構成環境に関連して、対応するドライバをダウンロードするために、公式ウェブサイトに行かなければならないが、最も重要なことにも対応してインストールする必要がありますPythonのセレンライブラリは本当に、その後、別の大規模な展開場合の対処環境の問題のいくつかを設定することは非常に簡単ではありませんも頭痛の種です。そして、このセクションでは、Pyppeteerと呼ばれる別の同様の選択肢を、ご紹介します。

Pyppeteerプロフィール

このセクションがPyppeteerと呼ばれるモジュールではなく、人形遣いを記述することに注意してください。人形遣いは、GoogleのNode.jsの開発に基づいたツールであり、それ私たちはJavaScriptを介して、Chromeブラウザを制御できる操作のいくつかと、もちろん、また、ウェブクローラとして使用すること、そのAPIは非常に強力な、非常に健全です。Pyppeteerそれは何ですか?これは、実際には実現の人形遣いのPythonのバージョンですが、彼は、Googleによって開発されていない、日本のエンジニアからの非公式版は人形遣いの機能のいくつかに基づいて開発されています。

Pyppetterではその背後にある事実にも何らかのアクションを実行する際に同様のChromeブラウザクロムブラウザのページレンダリングを持って、最初のChromeとクロムのブラウザの下に起源を述べました。

 
  1. Chromium 是谷歌为了研发 Chrome 而启动的项目,是完全开源的。二者基于相同的源代码构建,Chrome 所有的新功能都会先在 Chromium 上实现,待验证稳定后才会移植,因此 Chromium 的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium 的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的 Logo,但配色不同,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不同深度的蓝色构成。

Pyppeteerは、実行するクロムブラウザに依存しています。そうPyppeteer後で、我々はそれらの退屈な環境設定やその他の問題を回避することができます。クロムブラウザがインストールされていない、あなたが初めて実行する場合は、プログラムが自動的にインストールおよび設定するために私たちを助けるだろう、それは退屈な作業環境の設定を排除します。またPyppeteerは、Pythonは非同期達成の新機能に基づいているので、その実行のいくつかはまた、非同期操作をサポートし、効率相対セレンも増加しています。

環境インストール

  • ようPyppeteerので、Pythonの非同期メカニズムを使用してPythonのバージョンの運用要件3.5以上
  • pyppeteerをインストールするPIP

クイックスタート

 

-クロールhttp://quotes.toscrape.com/js/  ページ全体のデータを

 

 
  1. import asyncio
  2. from pyppeteer import launch
  3. from lxml import etree
  4.  
  5. async def main():
  6. browser = await launch()
  7. page = await browser.newPage()
  8. await page.goto('http://quotes.toscrape.com/js/')
  9. page_text = await page.content()
  10. tree = etree.HTML(page_text)
  11. div_list = tree.xpath('//div[@class="quote"]')
  12. print(len(div_list))
  13. await browser.close()
  14.  
  15. asyncio.get_event_loop().run_until_complete(main())

結果:10の
説明:起動方法は、新しいブラウザオブジェクトを作成し、ブラウザに割り当てられ、その後、NEWPAGEメソッドを呼び出すには、同時に新しいページオブジェクトを作成し、新しいブラウザタブに相当します。そして、Pageオブジェクトは、ブラウザがブラウザにロードされた該当ページにジャンプして、コンテンツのロードが完了した後にメソッドを呼び出し、現在のブラウザのページのソースコードに戻るには、後藤メソッドはこのURL入力に相当します呼び出します。さらに、我々はpyqueryと同じ決意を行っそこで、我々は、JavaScriptのレンダリング結果を得ることができます。このプロセスでは、我々はChromeブラウザを設定していない、ブラウザが同じ効果のセレンを達成するための煩雑な手順を排除し、ドライブを設定されていませんが、また、非同期のキャプチャ、Shuangwaiを達成するために!

詳細な利用状況

  • ブラウザを開き
    • あなたは、関連するパラメータが導入された、起動メソッドを呼び出すことができます。
      • ignoreHTTPSErrors(ブール値):あなたはHTTPSエラーを無視しますか、デフォルト値はFalseです。
      • ヘッドレス(ブール値):このパラメータがTrueのデベロッパーツールならば、ヘッドレスモードが有効になっている、それは何のインタフェースモードではありません、そしてパラメータは、デフォルトでは何のインタフェースモードを有効にされていないこと、Falseにそうでない場合はTrueに設定されます。
      • executablePath(STR):デフォルトクロムを指定する必要がない場合は、実行可能ファイルへのパスは、その後、あなたは、既存のクロムまたはクロムを指定することができます。
      • 引数(リスト[STR]):実装のプロセスでは、追加のパラメータを渡すことができます。
      • デベロッパーツール(ブール値):自動的に各ページのためのツールのデバッグをオンにするかどうか、既定値はFalseです。このパラメータがTrueに設定されている場合は、ヘッドレスパラメータは無効となり、Falseに強制されます。
  • 、記事がイライラプロンプトが表示され、あなたがたはそれをシャット「クローム制御されている自動テスト・ソフトウェア」:プロンプト記事をオフにしますか?次のように我々は引数のパラメータを使用して、操作を無効にする必要があり、この時間は次のとおりです。
     
    1. browser = await launch(headless=False, args=['--disable-infobars'])
  • ページ表示の問題の処理:淘宝網のホームをご覧ください

     
    1. import asyncio
    2. from pyppeteer import launch
    3.  
    4. async def main():
    5. browser = await launch(headless=False)
    6. page = await browser.newPage()
    7. await page.goto('https://www.taobao.com')
    8. await asyncio.sleep(10)
    9.  
    10. asyncio.get_event_loop().run_until_complete(main())


    ディスカバリーページは、問題を表示するには、手動でページの画素表示の長さと幅を設定するSETVIEWPORTメソッドを呼び出す必要があります。次のように設定します。

     
    1. import asyncio
    2. from pyppeteer import launch
    3.  
    4. width, height = 1366, 768
    5.  
    6. async def main():
    7. browser = await launch(headless=False)
    8. page = await browser.newPage()
    9. await page.setViewport({'width': width, 'height': height})
    10. await page.goto('https://www.taobao.com')
    11. await asyncio.sleep(3)
    12.  
    13. asyncio.get_event_loop().run_until_complete(main())
  • JSの実行手順:スクロールホイールをドラッグします。メソッドが呼び出される評価。

     
    1. import asyncio
    2. from pyppeteer import launch
    3. width, height = 1366, 768
    4. async def main():
    5. browser = await launch(headless=False)
    6. page = await browser.newPage()
    7. await page.setViewport({'width': width, 'height': height})
    8. await page.goto('https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=')
    9. await asyncio.sleep(3)
    10. #evaluate可以返回js程序的返回值
    11. dimensions = await page.evaluate('window.scrollTo(0,document.body.scrollHeight)')
    12. await asyncio.sleep(3)
    13. print(dimensions)
    14. await browser.close()
    15.  
    16. asyncio.get_event_loop().run_until_complete(main())
  • webdriverを検出を避けます:

     
    1. import asyncio
    2. from pyppeteer import launch
    3. async def main():
    4. browser = await launch(headless=False, args=['--disable-infobars'])
    5. page = await browser.newPage()
    6. await page.goto('https://login.taobao.com/member/login.jhtml?redirectURL=https://www.taobao.com/')
    7. await page.evaluate(
    8. '''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
    9. await asyncio.sleep(10)
    10.  
    11. asyncio.get_event_loop().run_until_complete(main())
  • UAの変装:
     
    1. await self.page.setUserAgent('xxx')
  • ノード間相互作用

     
    1. import asyncio
    2. from pyppeteer import launch
    3. async def main():
    4. # headless参数设为False,则变成有头模式
    5. browser = await launch(
    6. headless=False
    7. )
    8.  
    9. page = await browser.newPage()
    10. # 设置页面视图大小
    11. await page.setViewport(viewport={'width': 1280, 'height': 800})
    12.  
    13. await page.goto('https://www.baidu.com/')
    14. #节点交互
    15. await page.type('#kw','周杰伦',{'delay': 1000})
    16. await asyncio.sleep(3)
    17. await page.click('#su')
    18. await asyncio.sleep(3)
    19. #使用选择器选中标签进行点击
    20. alist = await page.querySelectorAll('.s_tab_inner > a')
    21. a = alist[3]
    22. await a.click()
    23. await asyncio.sleep(3)
    24. await browser.close()
    25. asyncio.get_event_loop().run_until_complete(main())

    演習

  • 網易は、見出しやニュースの見出しをクロール

     
    1. import asyncio
    2. from pyppeteer import launch
    3. from lxml import etree
    4. async def main():
    5. # headless参数设为False,则变成有头模式
    6. browser = await launch(
    7. headless=False
    8. )
    9.  
    10. page1 = await browser.newPage()
    11.  
    12. # 设置页面视图大小
    13. await page1.setViewport(viewport={'width': 1280, 'height': 800})
    14.  
    15. await page1.goto('https://www.toutiao.com/')
    16. await asyncio.sleep(2)
    17. # 打印页面文本
    18. page_text = await page1.content()
    19.  
    20. page2 = await browser.newPage()
    21. await page2.setViewport(viewport={'width': 1280, 'height': 800})
    22. await page2.goto('https://news.163.com/domestic/')
    23. await page2.evaluate('window.scrollTo(0,document.body.scrollHeight)')
    24. page_text1 = await page2.content()
    25.  
    26. await browser.close()
    27.  
    28. return {'wangyi':page_text1,'toutiao':page_text}
    29.  
    30. def parse(task):
    31. content_dic = task.result()
    32. wangyi = content_dic['wangyi']
    33. toutiao = content_dic['toutiao']
    34. tree = etree.HTML(toutiao)
    35. a_list = tree.xpath('//div[@class="title-box"]/a')
    36. for a in a_list:
    37. title = a.xpath('./text()')[0]
    38. print('toutiao:',title)
    39. tree = etree.HTML(wangyi)
    40. div_list = tree.xpath('//div[@class="data_row news_article clearfix "]')
    41. print(len(div_list))
    42. for div in div_list:
    43. title = div.xpath('.//div[@class="news_title"]/h3/a/text()')[0]
    44. print('wangyi:',title)
    45.  
    46. tasks = []
    47. task1 = asyncio.ensure_future(main())
    48. task1.add_done_callback(parse)
    49. tasks.append(task1)
    50. asyncio.get_event_loop().run_until_complete(asyncio.wait(tasks))

    爬取结果:
    toutiao: 「央视快评」坚守初心 为国奉献
    toutiao: 南航一A380客机北京降落时遭冰雹风挡现裂痕 已平安降落无人受伤
    toutiao: 美国正开启第二战场:围猎中国高科技企业 |“双线作战”战略意图
    toutiao: 云南省陆良县:农民给供销社打“白条”
    toutiao: 媒体:90后副县长若非靠拼爹上位 需拿出业绩服众
    toutiao: 南航A380飞北京客机遭遇冰雹袭击,挡风玻璃全碎
    toutiao: 秘鲁北部发生7.8级地震
    toutiao: 1958年,由捷克斯洛伐克援建的北京电影洗印厂曾为全国行业的老大
    toutiao: 一箭60星,发射成功!马斯克卫星互联网计划启动
    69
    wangyi: 中美经贸摩擦背后:有人在干,有人在骗
    wangyi: 华为回应个别标准组织撤销资格:产品服务不受影响
    wangyi: 隔空约架?中方主播刘欣23年前就赢得国际演讲比赛
    wangyi: 从钱学森到任正非 中国教育有多少底气应对全球化
    wangyi: 2个月内二度履新 35岁清华博士任安徽省直单位领导
    wangyi: 南阳“水氢发动机汽车”引热议 官方回应四大疑问
    wangyi: 31岁北大博士跻身县委常委 主笔6万字全县发展规划
    wangyi: 干部退休15年后投案自首 省委巡视办:头一次碰到
    wangyi: 台湾被标注"中国台湾省" 台外事部门要求更正被拒
    wangyi: 190天3次现场办公!南阳领导为何钟爱青年汽车项目

pyppeteer模块的基本使用

引言

Selenium 在被使用的时候有个麻烦事,就是环境的相关配置,得安装好相关浏览器,比如 Chrome、Firefox 等等,然后还要到官方网站去下载对应的驱动,最重要的还需要安装对应的 Python Selenium 库,确实是不是很方便,另外如果要做大规模部署的话,环境配置的一些问题也是个头疼的事情。那么本节就介绍另一个类似的替代品,叫做 Pyppeteer。

Pyppeteer简介

注意,本节讲解的模块叫做 Pyppeteer,不是 Puppeteer。Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用作网络爬虫上,其 API 极其完善,功能非常强大。 而 Pyppeteer 又是什么呢?它实际上是 Puppeteer 的 Python 版本的实现,但他不是 Google 开发的,是一位来自于日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本。

在 Pyppetter 中,实际上它背后也是有一个类似 Chrome 浏览器的 Chromium 浏览器在执行一些动作进行网页渲染,首先说下 Chrome 浏览器和 Chromium 浏览器的渊源。

 
  1. Chromium 是谷歌为了研发 Chrome 而启动的项目,是完全开源的。二者基于相同的源代码构建,Chrome 所有的新功能都会先在 Chromium 上实现,待验证稳定后才会移植,因此 Chromium 的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium 的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的 Logo,但配色不同,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不同深度的蓝色构成。

Pyppeteer 就是依赖于 Chromium 这个浏览器来运行的。那么有了 Pyppeteer 之后,我们就可以免去那些繁琐的环境配置等问题。如果第一次运行的时候,Chromium 浏览器没有安装,那么程序会帮我们自动安装和配置,就免去了繁琐的环境配置等工作。另外 Pyppeteer 是基于 Python 的新特性 async 实现的,所以它的一些执行也支持异步操作,效率相对于 Selenium 来说也提高了。

环境安装

  • 由于 Pyppeteer 采用了 Python 的 async 机制,所以其运行要求的 Python 版本为 3.5 及以上
  • pip install pyppeteer

快速上手

 

- 爬取http://quotes.toscrape.com/js/ 全部页面数据

 

 
  1. import asyncio
  2. from pyppeteer import launch
  3. from lxml import etree
  4.  
  5. async def main():
  6. browser = await launch()
  7. page = await browser.newPage()
  8. await page.goto('http://quotes.toscrape.com/js/')
  9. page_text = await page.content()
  10. tree = etree.HTML(page_text)
  11. div_list = tree.xpath('//div[@class="quote"]')
  12. print(len(div_list))
  13. await browser.close()
  14.  
  15. asyncio.get_event_loop().run_until_complete(main())

运行结果:10
解释:launch 方法会新建一个 Browser 对象,然后赋值给 browser,然后调用 newPage 方法相当于浏览器中新建了一个选项卡,同时新建了一个 Page 对象。然后 Page 对象调用了 goto 方法就相当于在浏览器中输入了这个 URL,浏览器跳转到了对应的页面进行加载,加载完成之后再调用 content 方法,返回当前浏览器页面的源代码。然后进一步地,我们用 pyquery 进行同样地解析,就可以得到 JavaScript 渲染的结果了。在这个过程中,我们没有配置 Chrome 浏览器,没有配置浏览器驱动,免去了一些繁琐的步骤,同样达到了 Selenium 的效果,还实现了异步抓取,爽歪歪!

详细用法

  • 开启浏览器
    • 调用 launch 方法即可,相关参数介绍:
      • ignoreHTTPSErrors (bool): 是否要忽略 HTTPS 的错误,默认是 False。
      • headless (bool): 是否启用 Headless 模式,即无界面模式,如果 devtools 这个参数是 True 的话,那么该参数就会被设置为 False,否则为 True,即默认是开启无界面模式的。
      • executablePath (str): 可执行文件的路径,如果指定之后就不需要使用默认的 Chromium 了,可以指定为已有的 Chrome 或 Chromium。
      • args (List[str]): 在执行过程中可以传入的额外参数。
      • devtools (bool): 是否为每一个页面自动开启调试工具,默认是 False。如果这个参数设置为 True,那么 headless 参数就会无效,会被强制设置为 False。
  • 关闭提示条:”Chrome 正受到自动测试软件的控制”,这个提示条有点烦,那咋关闭呢?这时候就需要用到 args 参数了,禁用操作如下:
     
    1. browser = await launch(headless=False, args=['--disable-infobars'])
  • 处理页面显示问题:访问淘宝首页

     
    1. import asyncio
    2. from pyppeteer import launch
    3.  
    4. async def main():
    5. browser = await launch(headless=False)
    6. page = await browser.newPage()
    7. await page.goto('https://www.taobao.com')
    8. await asyncio.sleep(10)
    9.  
    10. asyncio.get_event_loop().run_until_complete(main())


    发现页面显示出现了问题,需要手动调用setViewport方法设置显示页面的长宽像素。设置如下:

     
    1. import asyncio
    2. from pyppeteer import launch
    3.  
    4. width, height = 1366, 768
    5.  
    6. async def main():
    7. browser = await launch(headless=False)
    8. page = await browser.newPage()
    9. await page.setViewport({'width': width, 'height': height})
    10. await page.goto('https://www.taobao.com')
    11. await asyncio.sleep(3)
    12.  
    13. asyncio.get_event_loop().run_until_complete(main())
  • 执行js程序:拖动滚轮。调用evaluate方法。

     
    1. import asyncio
    2. from pyppeteer import launch
    3. width, height = 1366, 768
    4. async def main():
    5. browser = await launch(headless=False)
    6. page = await browser.newPage()
    7. await page.setViewport({'width': width, 'height': height})
    8. await page.goto('https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=')
    9. await asyncio.sleep(3)
    10. #evaluate可以返回js程序的返回值
    11. dimensions = await page.evaluate('window.scrollTo(0,document.body.scrollHeight)')
    12. await asyncio.sleep(3)
    13. print(dimensions)
    14. await browser.close()
    15.  
    16. asyncio.get_event_loop().run_until_complete(main())
  • 规避webdriver检测:

     
    1. import asyncio
    2. from pyppeteer import launch
    3. async def main():
    4. browser = await launch(headless=False, args=['--disable-infobars'])
    5. page = await browser.newPage()
    6. await page.goto('https://login.taobao.com/member/login.jhtml?redirectURL=https://www.taobao.com/')
    7. await page.evaluate(
    8. '''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
    9. await asyncio.sleep(10)
    10.  
    11. asyncio.get_event_loop().run_until_complete(main())
  • UA伪装:
     
    1. await self.page.setUserAgent('xxx')
  • 节点交互

     
    1. import asyncio
    2. from pyppeteer import launch
    3. async def main():
    4. # headless参数设为False,则变成有头模式
    5. browser = await launch(
    6. headless=False
    7. )
    8.  
    9. page = await browser.newPage()
    10. # 设置页面视图大小
    11. await page.setViewport(viewport={'width': 1280, 'height': 800})
    12.  
    13. await page.goto('https://www.baidu.com/')
    14. #节点交互
    15. await page.type('#kw','周杰伦',{'delay': 1000})
    16. await asyncio.sleep(3)
    17. await page.click('#su')
    18. await asyncio.sleep(3)
    19. #使用选择器选中标签进行点击
    20. alist = await page.querySelectorAll('.s_tab_inner > a')
    21. a = alist[3]
    22. await a.click()
    23. await asyncio.sleep(3)
    24. await browser.close()
    25. asyncio.get_event_loop().run_until_complete(main())

    综合练习

  • 爬取头条和网易的新闻标题

     
    1. import asyncio
    2. from pyppeteer import launch
    3. from lxml import etree
    4. async def main():
    5. # headless参数设为False,则变成有头模式
    6. browser = await launch(
    7. headless=False
    8. )
    9.  
    10. page1 = await browser.newPage()
    11.  
    12. # 设置页面视图大小
    13. await page1.setViewport(viewport={'width': 1280, 'height': 800})
    14.  
    15. await page1.goto('https://www.toutiao.com/')
    16. await asyncio.sleep(2)
    17. # 打印页面文本
    18. page_text = await page1.content()
    19.  
    20. page2 = await browser.newPage()
    21. await page2.setViewport(viewport={'width': 1280, 'height': 800})
    22. await page2.goto('https://news.163.com/domestic/')
    23. await page2.evaluate('window.scrollTo(0,document.body.scrollHeight)')
    24. page_text1 = await page2.content()
    25.  
    26. await browser.close()
    27.  
    28. return {'wangyi':page_text1,'toutiao':page_text}
    29.  
    30. def parse(task):
    31. content_dic = task.result()
    32. wangyi = content_dic['wangyi']
    33. toutiao = content_dic['toutiao']
    34. tree = etree.HTML(toutiao)
    35. a_list = tree.xpath('//div[@class="title-box"]/a')
    36. for a in a_list:
    37. title = a.xpath('./text()')[0]
    38. print('toutiao:',title)
    39. tree = etree.HTML(wangyi)
    40. div_list = tree.xpath('//div[@class="data_row news_article clearfix "]')
    41. print(len(div_list))
    42. for div in div_list:
    43. title = div.xpath('.//div[@class="news_title"]/h3/a/text()')[0]
    44. print('wangyi:',title)
    45.  
    46. tasks = []
    47. task1 = asyncio.ensure_future(main())
    48. task1.add_done_callback(parse)
    49. tasks.append(task1)
    50. asyncio.get_event_loop().run_until_complete(asyncio.wait(tasks))

    爬取结果:
    toutiao: 「央视快评」坚守初心 为国奉献
    toutiao: 南航一A380客机北京降落时遭冰雹风挡现裂痕 已平安降落无人受伤
    toutiao: 美国正开启第二战场:围猎中国高科技企业 |“双线作战”战略意图
    toutiao: 云南省陆良县:农民给供销社打“白条”
    toutiao: 媒体:90后副县长若非靠拼爹上位 需拿出业绩服众
    toutiao: 南航A380飞北京客机遭遇冰雹袭击,挡风玻璃全碎
    toutiao: 秘鲁北部发生7.8级地震
    toutiao: 1958年,由捷克斯洛伐克援建的北京电影洗印厂曾为全国行业的老大
    toutiao: 一箭60星,发射成功!马斯克卫星互联网计划启动
    69
    wangyi: 中美经贸摩擦背后:有人在干,有人在骗
    wangyi: 华为回应个别标准组织撤销资格:产品服务不受影响
    wangyi: 隔空约架?中方主播刘欣23年前就赢得国际演讲比赛
    wangyi: 从钱学森到任正非 中国教育有多少底气应对全球化
    wangyi: 2个月内二度履新 35岁清华博士任安徽省直单位领导
    wangyi: 南阳“水氢发动机汽车”引热议 官方回应四大疑问
    wangyi: 31岁北大博士跻身县委常委 主笔6万字全县发展规划
    wangyi: 干部退休15年后投案自首 省委巡视办:头一次碰到
    wangyi: 台湾被标注"中国台湾省" 台外事部门要求更正被拒
    wangyi: 190天3次现场办公!南阳领导为何钟爱青年汽车项目

おすすめ

転載: www.cnblogs.com/presleyren/p/11275484.html