支持JS呈现的httpget,可以轻松地从页面获取呈现的HTML

get-html的Python项目详细描述


获取html:获取原始或呈现的html(对于人类)

在⇝阅读关于我如何开始实现这一点的所有详细信息 Rendering-HTML_a-journey

这个模块是为任何人需要刮HTML(即,刮网页)。在

它只知道如何做一件事,但做得很好:从网页获取HTML。HTML的类型由您决定。或者:

  • 直接从服务器或
  • 在JS/AJAX调用之后,呈现了HTML。在

此外,它的制作使得你可以在整个项目中使用一种独特的方法, 并在启动时通过设置环境变量在这两种行为之间切换。在

HtmlRenderer:一个无缝呈现页面的类

HtmlRenderer为您处理所有特定的pyppeteer内容。它也是线程安全的。在

“同步”使用

以下是的典型用法

fromget_htmlimportHtmlRendererrenderer=HtmlRenderer()try:# use the renderer. The underlying browser will be instantiated on first call to render.response=renderer.render(url='https://xkcd.com')html=response.text# or resposne.content to get the raw bytes# ... etc.finally:# close the underlying browserrenderer.close()

或者简单地使用上下文管理器

^{pr2}$

如果在获取内容之前需要操作页面,请将async函数传递给render。 它将在页面加载后,但在获取HTML内容之前调用。 例如:

fromget_htmlimportcreate_rendererasyncdefscroll_to_end(page):# https://github.com/miyakogi/pyppeteer/issues/205#issuecomment-470886682awaitpage.evaluate('{window.scrollBy(0, document.body.scrollHeight);}')withcreate_renderer()asrenderer:response=renderer.render('https://9gag.com',manipulate_page_func=scroll_to_end)

“异步”用法

所有公共方法都有一个async对应的方法。但是,在使用async时,需要确保

  1. 浏览器创建一次
  2. 浏览器关闭一次。在

默认情况下,浏览器在第一次使用时启动,通常在第一次调用render时启动。 当使用async时,这可能是一个问题,因为多个协同程序将尝试多次创建浏览器。 要避免这种情况,请确保在启动其他任务之前触发浏览器创建(与关闭相同,等待所有任务完成)。在

具体示例见 examples/async_example.py。要点如下:

importasynciofromget_htmlimportHtmlRendererloop=asyncio.get_event_loop()renderer=HtmlRenderer()# trigger the browser creation only once, before the tasksloop.run_until_complete(renderer.async_browser)# .. TASKS WITH RENDERING CALLS ... #    e.g. loop.run_until_complete(someRenderingTask())# finally close the browser once the tasks completedloop.run_until_complete(renderer.async_close())

做得到:在行为之间毫无意义地切换

fromget_html.env_defined_getimportdo_getresponse=do_get('https://xkcd.com')assertresponse.status_code==200html_bytes=response.contenthtml_string=response.text

do_get的实际行为将取决于环境变量RENDER_HTML

  • RENDER_HTML=[1|y|true|on]do_get将在后台启动一个chromium实例并呈现页面(呈现的HTML)
  • RENDER_HTML=<anything BUT 2>(默认):do_get将把调用转发给requests.get(原始HTML)。 在阅读多线程部分之前,NOT请先使用2。在

如果启用呈现支持,则将在加载模块时启动,并在应用程序的整个生命周期中保持活动状态。 如果你的记忆力不好(铬!!)请记住这一点。在

多线程

HtmlRenderer是线程安全的。在

对于具有呈现支持的do_get,有两种可能。在

  1. 创建仅一个浏览器,由所有线程共享。在这种情况下,一次只能有一个线程执行render(锁定机制)
  2. 创建one browser per thread。在这种情况下,线程可以并行呈现。但是要小心,每次新线程调用do_get启动一个新的浏览器,它将一直运行到程序结束(或直到您调用get_html.env_defined_get.close())。在

通过设置RENDER_HTML=2启用模式(2)。但是,同样,确保你没有太多的线程,因为chromium需要很多内存。在

运行测试

在Windows/Linux上:

pip install tox
tox

在Mac上(请参见https://github.com/tox-dev/tox/issues/1485):

pip install "tox<3.7"
tox

常见错误

libXX not found(Linux)

issue #290 of puppeteer

sudo apt-get install gconf-service libasound2 libatk1.0-0 libatk-bridge2.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使图像以正确的速度在屏幕上移动,以适应所有显示   内存Java分配:从预先存在/分配的池中分配对象   java这种书写方式?   Java正则表达式查找字符串的开头   java是否可以创建一个类来处理安卓中的所有日志代码(例如log.d(TAG,message))   如何使用Selenium和java单击WebTable任意页面上的WebElement   java解析字符串中的文件名   java刷新JTree内容   java如何覆盖RequestMappingHandler   爪哇数石头、布、剪刀赢了多少   struts中的java无效令牌   swing JTree,优化算法,Java   java Tomcat和SSL:密钥库格式无效