<p>如果您检查此网页的<strong>原始html源代码</strong>(google Chrome webbrowser上的CTRL+U,!!!不是来自Crhome developer tools/elements部分的html代码)<br/>您将看到两件重要的事情:</p>
<ol>
<li>像<code><div class="lazy-image listing-slider-carousel-item lazy-image-loaded"></code>这样的标记中的图像以及其他数据不存在于这些html标记中</李>
<li>存储在<code>script</code>标记和<code>window.REDUX_INITIAL_STATE</code>javascript变量内的所有数据:<br/><br/>
<a href="https://i.stack.imgur.com/gIfXh.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/gIfXh.png" alt="original html source"/></a></li>
</ol>
<p>在这种情况下,我们可以使用python的内置<code>json</code>模块将javascript变量中的数据转换为基本python <code>dict</code>格式。<br/>此任务最复杂的部分是将<code>script</code>标记的内容正确地适配到<code>json.loads</code>函数中。严格来说,它应该是在<code>window.REDUX_INITIAL_STATE =</code>之后和下一个javascript操作之前的文本(在本例中是在最新的<code>;</code>符号之前)。
因此,我们将获得以下代码:</p>
<pre><code>def parse(self, response):
script_tag = [script for script in response.css("script::text").extract() if "window.REDUX_INITIAL_STATE = {" in script]
script_data = json.loads(script_tag[0].split("window.REDUX_INITIAL_STATE = ")[-1][:-1], encoding="utf-8")
</code></pre>
<p>如以下调试器屏幕截图所示,所有数据均已成功转换:
<a href="https://i.stack.imgur.com/e2gyu.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/e2gyu.png" alt="debugger_converted_data"/></a>
作为字典列表存储在<code>script_data['app']['listing']['listing']['entity']['lh-95810']['images']</code>中的图像:
<a href="https://i.stack.imgur.com/LdgHn.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/LdgHn.png" alt="debugger_images"/></a>
<code>lh-95810</code>是实体id,因此在更新的代码中,将单独选择此实体id,以便能够在其他页面中使用它:</p>
<pre><code>def parse(self, response):
script_tag = [script for script in response.css("script::text").extract() if "window.REDUX_INITIAL_STATE = {" in script]
script_data = json.loads(script_tag[0].split("window.REDUX_INITIAL_STATE = ")[-1][:-1], encoding="utf-8")
entity_key = [k for k in script_data['app']['listing']['listing']['entity'].keys()]
images = [image["medium"] for image in script_data['app']['listing']['listing']['entity'][entity_key[0]]['images']]
</code></pre>
<p>本网站使用javascript在网页上呈现数据。任何javascript格式的内容都源于原始html代码。
这种方法只使用内置的<code>json</code>模块,不需要css或Xpath选择器</p>