python - 如何用Python抓取网页渲染完成后的HTML内容

标签 python html beautifulsoup rendering

我目前的任务是抓取流行的笑话网站。一个例子是名为 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]

Output: #

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

如何在等待一段时间或渲染完成后抓取页面。我需要使用像 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

最佳答案

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

关于python - 如何用Python抓取网页渲染完成后的HTML内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36264427/

相关文章:

python - S4cmd 给予权限被拒绝错误

javascript - 重复轮播如何使用JavaScript?

Python BeautifulSoup 同一容器中相似的div排序

python - 使用 Python 和 BeautifulSoup 为 Yahoo 和 Bing 生成多个页面的 URL

python - WebSocket 聊天异步示例崩溃

Python slimit 最小化不需要的警告输出

html - 在使嵌入式视频响应时遇到问题

python - 如何使用python和beautiful soup将一个html页面拆分为多个页面

python - 开发神经网络时如何在python中使用sigmoid函数

javascript - 幻灯片功能和 Internet Explorer 11