【问题标题】:How to scrape the HTML content of a webpage after rendering is completed in Python [duplicate]如何在Python中完成渲染后抓取网页的HTML内容[重复]
【发布时间】:2016-07-15 20:03:06
【问题描述】:

我目前的任务是抓取流行的笑话网站。一个例子是一个名为jokes.cc.com 的网站。如果您访问该网站,请将光标悬停在页面左侧的 “获取随机笑话” 按钮上方,您会注意到它重定向到的链接将是 jokes.cc.com/#。

如果您稍等片刻,它会变为网站内显示实际笑话的正确链接。它更改为jokes.cc.com/*legit joke link*。

如果您分析页面的 HTML,您会注意到有一个链接 (<a>) 带有一个 class=random_link,其 <href> 存储了该页面想要重定向您的随机笑话的链接。您可以在页面完全加载后进行检查。基本上,“#”被合法链接所取代。

现在,这里是我用于抓取 HTML 的代码,就像我迄今为止对静态网站所做的那样。我用过BeautifulSoup 库:

import urllib
from bs4 import BeautifulSoup

urlToRead = "http://jokes.cc.com";
handle = urllib.urlopen(urlToRead)
htmlGunk =  handle.read()
soup = BeautifulSoup(htmlGunk, "html.parser")
# Find out the exact position of the joke in the page
print soup.findAll('a', {'class':'random_link'})[0]

输出:#

这是预期的输出,因为我意识到页面尚未完全呈现。

等待一段时间后或渲染完成后如何抓取页面。我需要使用像 Mechanize 这样的外部库吗?我不确定如何做到这一点,因此感谢任何帮助/指导

编辑:我终于能够通过在 Python 中使用 PhantomJS 和 Selenium 来解决我的问题。这是渲染完成后获取页面的代码。

from bs4 import BeautifulSoup
from selenium import webdriver


driver = webdriver.PhantomJS() #selenium for PhantomJS
driver.get('http://jokes.cc.com/')
soupFromJokesCC = BeautifulSoup(driver.page_source) #fetch HTML source code after rendering
# locate the link in HTML
randomJokeLink = soupFromJokesCC.findAll('div', {'id':'random_joke'})[0].findAll('a')[0]['href']
# now go to that page and scrape the joke from there
print randomJokeLink #It works :D

【问题讨论】:

    标签: python html beautifulsoup rendering


    【解决方案1】:

    您需要的数据是由页面加载时动态运行的 JavaScript 生成的。 BeautifulSoup 没有 JavaScript 引擎,因此无论您等待多长时间,链接都不会改变。有一些 Python 库可以抓取和理解 JavaScript,但你最好的选择可能是挖掘并弄清楚网站上的 JS 是如何工作的。例如,如果他们有一个笑话数据源,其中一个随机笑话是从中提取的,那么它可能是 Python 可以很容易地解析的 JSON 等格式。这将使您的应用程序比包含一个成熟的脚本引擎更轻量级。

    【讨论】:

    • selenium 浏览器自动化会是正确的选择吗?
    • 注:我从未使用过 Selenium,但这取决于您的项目范围。如果您正在编写一个显示笑话的应用程序,那么自动化 Web 浏览器可能并不理想。这将要求您的用户安装并打开浏览器,并且您最终会将大量工作卸载到该浏览器。但是,如果您深入了解 JavaScript 的工作原理,您可以在应用内重新创建行为并收集笑话,而无需考虑 JavaScript。
    • 使用无头浏览器怎么样?
    • 我设法使用 PhantomJS 和 Selenium 解决了它。看看更新的描述
    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2017-11-08
    • 2020-03-27
    • 1970-01-01
    • 2015-04-02
    • 2019-07-19
    • 2020-05-24
    相关资源
    最近更新 更多