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