如何在Python中加载站点的所有资源,包括AJAX请求等?

问题描述 投票:0回答:3

我知道如何使用 Python 请求网站并阅读其文本。过去,我曾尝试使用像 BeautifulSoup 这样的库来发出对网站上链接的所有请求,但这并没有得到看起来不像完整 URL 的内容,例如 AJAX 请求和大多数对原始域名(因为“http://example.com”将会丢失,更重要的是,它不是

<a href='url'>Link</a>
格式,所以 BeautifulSoup 会错过它)。

如何用 Python 加载站点的所有资源?它是否需要与 Selenium 之类的东西进行交互,或者是否有一种方法在没有它的情况下也不太难实现?我没怎么用过 Selenium,所以我不确定这会有多困难。

谢谢

python selenium beautifulsoup urllib2 python-requests
3个回答
2
投票

这完全取决于您想要什么以及如何想要它。最适合您的是

from ghost import Ghost
ghost = Ghost()
page, extra_resources = ghost.open("http://jeanphi.fr")
assert page.http_status==200 and 'jeanphix' in ghost.content

该项目的源代码是这里


0
投票

嗯,这是一个非常有趣的问题。对于那些由于在运行时生成的 URL 无法完全识别的资源或类似的资源(例如脚本中使用的资源,而不仅仅是 AJAX),您需要实际 run 网站,以便脚本得到执行和动态URL 已创建。

一种选择是使用类似于这个答案描述的内容,即使用第三方库(例如 Qt)来实际运行网站。要收集所有 URL,您需要某种方式监控网站发出的所有请求,可以像这样完成(虽然是 C++,但代码本质上是相同的)

最后,一旦获得 URL,您就可以使用类似 Requests 的内容来下载外部资源。


0
投票

我很想听到其他方法,特别是如果它们更简洁(更容易记住),但我认为这可以实现我的目标。但它并没有完全回答我原来的问题——这比使用

requests.get(url)
得到了更多的东西——在这种情况下这对我来说已经足够了`:

import urllib2
url = 'http://example.com'
headers = {'User-Agent' : 'Mozilla/5.0'}
request = urllib2.Request(url,None,headers)
sock = urllib2.urlopen(request)
ch = sock.read()
sock.close()
© www.soinside.com 2019 - 2024. All rights reserved.