Google 在进行本地搜索时将其主页提供给 urllib2

Google serves its homepage to urllib2 when a local search is made

当在 Google 上完成本地搜索时,用户点击地图下方的 'More ...' link,然后将用户带到 this.

如果URL:

https://www.google.com/ncr#q=chiropractors%2BNew+York,+NY&rflfq=1&rlha=0&tbm=lcl

被复制并粘贴回浏览器,正如预期的那样,到达同一页面。同样,当使用 WebDriver 打开浏览器时,直接访问 URL 会将 WebDriver 带到同一页面。

但是,当尝试使用 urllib2 请求同一页面时,Google 为其提供主页 (google.com),并且这意味着,除其他外,lxml 的提取功能无法使用。

虽然 urllib2 不是这里的罪魁祸首(也许 Google 对所有无头请求做同样的事情),有没有办法让 Google 到提供所需的页面?使用 requests 库的快速测试表明存在同样的问题。

我认为这里的重要提示在 URL:

https://www.google.com/ncr#q=chiropractors%2BNew+York,+NY&rflfq=1&rlha=0&tbm=lcl

你注意到那里有那个哈希字符 (#) 了吗?散列组件之后的所有内容都不会真正发送到服务器,因此服务器无法处理它。这表明(在这种情况下)您在 WebDriver 和浏览器中看到的页面是客户端脚本的结果。

当您加载页面时,您的浏览器会发送对 https://www.google.com/ncr 和 google returns 主页的请求。主页包含 javascript 分析散列后的组件并使用它生成您 期望 看到的页面。浏览器和 Webdriver 可以执行此操作,因为它们处理 javascript。如果您在浏览器中禁用 javascript 并转到 link,您将看到该页面也没有生成。

urllib2 然而,不处理 javascript。它所看到的只是网站最初与 javascript 一起发送的 HTML,但它无法处理实际生成您期望的页面的 javascript。

Google 正在为您请求的页面提供服务,但您的问题是 urllib2 无法呈现它。要解决此问题,您必须使用支持 Javascript 的抓取框架。在这种特殊情况下,您可以选择使用 Google 的非 javascript 版本进行抓取。