使用 python 快速抓取动态内容

Posted

技术标签:

【中文标题】使用 python 快速抓取动态内容【英文标题】:Scraping dynamic content quickly with python 【发布时间】:2016-03-20 21:29:05 【问题描述】:

我正在尝试使用在 javascript 中生成的 Python 动态内容进行抓取(此视频的观看次数和 cmets 数:http://v.youku.com/v_show/id_XMTM5NTI3NDY3Ng==.html?from=y1.3-idx-uhome-1519-20887.205805-205902.5-2)。

我熟悉 BeautifulSoup(运行时间约为 0.1 秒,但没有 JavaScript 评估)和 Selenium(3 多秒,即使我停用 CSS、图像等,但会解释 JS)。

有没有一种方法可以在不使用浏览器的情况下在 Python 中抓取 JavaScript 函数的结果(假设这会降低 Selenium 的速度)?

我的 Selenium 代码如下:

# coding=utf-8

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.common.keys import Keys

firefox_profile=webdriver.FirefoxProfile()
#firefox_profile.set_preference('permissions.default.stylesheet',2)
firefox_profile.set_preference('permissions.default.image',2)
firefox_profile.set_preference('dom.ipc.plugins.enabled.libflashplayer.so',2)
driver = webdriver.Firefox(firefox_profile=firefox_profile)
time.sleep(7)

start=time.time()
def getYoukuVideoStats(youkuVideoUrl):
    driver.get(youkuVideoUrl)
    text= driver.find_element_by_id("allnum_cmt").text
    print text

youku_video_urls_full=["http://v.youku.com/v_show/id_XOTU2Nzc3NDYw.html"]

for youkuVideoUrl in youku_video_urls_full:
    try:
        getYoukuVideoStats(youkuVideoUrl)
        print youkuVideoUrl
    except Exception, e:
        print "Error with video: "+youkuVideoUrl
        print str(e)

print time.time()-start

【问题讨论】:

【参考方案1】:

您确实需要使用浏览器来呈现 JS,但您可以使用无头浏览器,例如 phantomjs。这将加快您的运行时间,并且您不会看到浏览器打开。

【讨论】:

【参考方案2】:

不,不使用浏览器,无论是可见还是不可见(phantomjs),都无法抓取 js 代码的结果。

【讨论】:

【参考方案3】:

您还可以使用splash,它使 javascript 呈现变得容易,使其像服务一样,因此您可以像抓取普通网站一样继续使用它。

它与scrapy 配合使用非常好,用于 python 网络抓取。

【讨论】:

以上是关于使用 python 快速抓取动态内容的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 抓取网页动态内容(动态 HTML/Javascript 表格)

使用 python-Scrapy 抓取动态内容

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

用爬虫抓取网页得到的源代码和浏览器中看到的不一样运用了啥技术?

python网络爬虫抓取动态网页并将数据存入数据库MySQL