让我们假设我们只谈论HTML数据。一个Web服务器可以为你提供许多其他格式的数据(JSON/XML等)
请注意我所描述的是泛化,和大多数泛化一样,你可以找到不适合它的异常。
广义地,我们可以划分显示的数据的类型(最终用户)两大类
预渲染
的整个HTML页面在服务器端构建并发送到客户端。在这里,JS方面关注用户交互,而不关注数据的结构。
我们正在慢慢地摆脱这种类型的结构,但目前绝大多数网页都使用这种结构。
网络报废在这里比较容易,因为我们可以通过编程方式拉出html页面,而不必担心随附的JavaScript代码。
requests
和beautifulsoup
的组合应该可以在几乎所有情况下工作(假设您可以识别文档的一般结构)。
后期渲染
这里是从服务器返回的HTML页面只是一个“骨架”或占位符的实际数据。数据由随附的JS代码呈现。
在这种情况下,如果您通过例如请求获取源文件,您将得到一个空壳,其中没有数据。
为此,如果您在渲染时检查浏览器所做的调用(Chrome的网络选项卡或Firefox的检查工具或更受欢迎的萤火虫),则很可能会看到ajax请求会从服务器返回实际数据)
根据请求的方式,你可以命中ajax端点,并以JSON获取数据。
您可以使用response.json()
函数将其解压缩为python-dicts。
在某些(罕见)情况下,不会有ajax调用,但从服务器提供的HTML仍然是一个shell。实际数据是该文件的一部分,但是作为JS代码本身的一部分存储。这可以由于各种原因完成,例如,将动态数据发送到静态js文件,或者仅仅阻止简单的刮取页面的尝试。
一种方法来刮这样的页面将“呈现”在一个无头的浏览器页面,执行JS代码,并返回可能通过解析器解析像beautifulsoup
beautifulsoup有劳动能力的HTML与许多parsers,其中之一是html5lib
,这可以解决这个问题。
你也可以看看selenium或mechanize
或者你可以尝试解析JS代码自己可能会更快。
要得出结论,需要仔细检查页面在浏览器上的呈现方式。即使你没有看到ajax请求,服务器提供的html也不一定是浏览器显示它的方式。
一个好的开始方法是通过查看正在提供的裸html,方法是通过curl
或requests.get
下载页面,或者仅在JavaScript禁用的情况下将其呈现在浏览器中。
祝你好运。
来源
2014-09-26 07:01:41
srj
感谢您的详细回复。 +1 ......这确实有帮助。但是,我期望找到的是第三种类型的网页,您最终选择了像硒这样的模块。我的意思是 - 他们帮助了很多,但是没有办法得到结果而无需使用浏览器并将其保存为纯Python?我们现在知道html,json,xml。还有其他人吗?再次,我不寻找方法刮,但只是在哪里可能存储的数据...再次感谢 – 2014-09-26 07:25:04
你可以寻找[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