我刚开始使用Python Web抓取请求。这可能是一个广泛的问题,我将尽量使其尽可能简短。
我遇到的情况是,有时可以使用r.content
下载整个页面源(其中r是请求的get调用的响应对象)
有时,某些部分数据以json格式存储...在可以通过深入观察get和post调用访问的文件中。
但是,我甚至发现整个内容都在DOM中的网站,但其中一部分既不在页面源也不在Json文件中。
我想知道网站中有多少这样的地方可以存储数据? (只是名字,我不是在寻找如何到达那里)
对于这些最后一类网站,我观察了几乎所有的请求调用,但找不到数据的位置。
除了上面提到的2之外,还有其他地方吗?或者那些只是两个表明我没有按照观察请求电话的方式工作?
你可以在简短的要点中回答它,我可以从那里学习。
提前致谢。
答案 0 :(得分:1)
让我们假设我们只讨论HTML数据。 Web服务器可以为您提供许多其他格式的数据(JSON / XML等)
请注意,我所描述的是概括,与大多数概括一样,您可以找到不适合的异常。
从广义上讲,我们可以将显示的数据类型(针对最终用户)划分为两类
预渲染
整个HTML页面在服务器端构建并发送到客户端。在这里,JS方面关注的是用户交互,而不关心数据的结构。
我们正逐渐远离这种类型的结构,但目前绝大多数网页都使用此结构。
网页报废在这里相对容易,因为我们可以以编程方式提取html页面,而不用担心随附的javascript代码。
requests
和beautifulsoup
的组合应该适用于几乎所有情况(假设您可以识别文档的一般结构)。
发布后
这里从服务器返回的HTML页面只是一个"骨架"或实际数据的占位符。数据由随附的JS代码呈现。
在这种情况下,如果您通过例如。,request获取源文件,您将得到一个空shell,其中没有数据。
如果您在渲染时检查浏览器进行的调用(Chrome浏览器的网络选项卡或firefox的检查工具或更受欢迎的firebug),您很可能会看到带回来的ajax请求来自服务器的实际数据)
取决于请求的生成方式,您可以点击该ajax端点,并以JSON格式获取数据。
您可以使用response.json()
函数将其解压缩为python-dicts。
在某些(罕见)情况下,不会有ajax调用,但从服务器提供的HTML仍然是shell。实际数据是该服务文件的一部分,但作为JS代码本身的一部分存储。这可以出于各种原因,例如将动态数据发送到静态js文件,或者只是为了阻止简单的抓取页面的尝试。
抓取此类网页的一种方法是渲染'无头浏览器中的页面,它执行JS代码并返回可通过beautifulsoup
等解析器解析的HTML
beautifulsoup可以使用许多parsers,其中一个是html5lib
,可以解决这个问题。
或者您可以尝试自己解析js代码,这可能会更快。
在得出使用内容的结论时,需要仔细检查页面在浏览器上的呈现方式。即使您没有看到ajax请求,服务器提供的html也不一定是浏览器显示它的方式。
一个好的开始方法是查看正在投放的裸-html,方法是通过curl
或requests.get
下载页面,或者只是在浏览器中使用javascript禁用它。< / p>
祝你好运。