2014-09-26 57 views
0

我刚刚开始使用Python Web通过请求进行抓取。这可能是一个广泛的问题,我会尽量使其尽可能简短。网站存储数据的地方

我通过情况有时整个页面的源代码可以下载来r.content(其中r是请求的的响应对象获取调用)数据的某些部分被保存在JSON格式

有时候在...文件,可以通过深入观察get和post调用进行访问。

但是,我甚至发现整个内容都在DOM中的网站,但其中的一部分既不在Page源也不在Json文件中。

我想知道有多少这样的地方可以网站存储数据? (只是名称,我不是在寻找如何到达那里)

对于这些最后一类网站,我几乎观察到每个请求调用,但无法找到数据的位置。

那么除了上面提到的2之外,还有其他地方吗?或者那些是唯一的两个表明我没有做我的工作正确的观察请求电话?

你可以用简短的项目符号来回答,我可以从那里读书。

在此先感谢。

回答

1

让我们假设我们只谈论HTML数据。一个Web服务器可以为你提供许多其他格式的数据(JSON/XML等)

请注意我所描述的是泛化,和大多数泛化一样,你可以找到不适合它的异常。

广义地,我们可以划分显示的数据的类型(最终用户)两大类

  • 预渲染
  • 邮政渲染

预渲染

的整个HTML页面在服务器端构建并发送到客户端。在这里,JS方面关注用户交互,而不关注数据的结构。

我们正在慢慢地摆脱这种类型的结构,但目前绝大多数网页都使用这种结构。

网络报废在这里比较容易,因为我们可以通过编程方式拉出html页面,而不必担心随附的JavaScript代码。

requestsbeautifulsoup的组合应该可以在几乎所有情况下工作(假设您可以识别文档的一般结构)。

后期渲染

这里是从服务器返回的HTML页面只是一个“骨架”或占位符的实际数据。数据由随附的JS代码呈现。

在这种情况下,如果您通过例如请求获取源文件,您将得到一个空壳,其中没有数据。

为此,如果您在渲染时检查浏览器所做的调用(Chrome的网络选项卡或Firefox的检查工具或更受欢迎的萤火虫),则很可能会看到ajax请求会从服务器返回实际数据)

根据请求的方式,你可以命中ajax端点,并以JSON获取数据。

您可以使用response.json()函数将其解压缩为python-dicts。

在某些(罕见)情况下,不会有ajax调用,但从服务器提供的HTML仍然是一个shell。实际数据是该文件的一部分,但是作为JS代码本身的一部分存储。这可以由于各种原因完成,例如,将动态数据发送到静态js文件,或者仅仅阻止简单的刮取页面的尝试。

一种方法来刮这样的页面将“呈现”在一个无头的浏览器页面,执行JS代码,并返回可能通过解析器解析像beautifulsoup

beautifulsoup有劳动能力的HTML与许多parsers,其中之一是html5lib,这可以解决这个问题。

你也可以看看seleniummechanize

或者你可以尝试解析JS代码自己可能会更快。

要得出结论,需要仔细检查页面在浏览器上的呈现方式。即使你没有看到ajax请求,服务器提供的html也不一定是浏览器显示它的方式。

一个好的开始方法是通过查看正在提供的裸html,方法是通过curlrequests.get下载页面,或者仅在JavaScript禁用的情况下将其呈现在浏览器中。

祝你好运。

+0

感谢您的详细回复。 +1 ......这确实有帮助。但是,我期望找到的是第三种类型的网页,您最终选择了像硒这样的模块。我的意思是 - 他们帮助了很多,但是没有办法得到结果而无需使用浏览器并将其保存为纯Python?我们现在知道html,json,xml。还有其他人吗?再次,我不寻找方法刮,但只是在哪里可能存储的数据...再次感谢 – 2014-09-26 07:25:04

+0

你可以寻找[python-sellenium](http://selenium-python.readthedocs.org/)需要一个浏览器驱动程序和一台带GUI的机器,尽管有办法解决这个问题。 你可以开始[这里](https://realpython.com/blog/python/headless-selenium-testing-with-python-and-phantomjs/) 但尝试首先使用html5lib美丽的汤,因为这可能会成为两种选择之间最快的。 – srj 2014-09-26 21:28:55