0

When a local search is done on Google, then the user clicks on the 'More ...' link below the map, the user is then brought to a page such as this.

If the URL:

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

is copied out and pasted back into a browser, one arrives, as expected, at the same page. Likewise when a browser is opened with WebDriver, directly accessing the URL brings WebDriver to the same page.

When an attempt is made, however, to request the same page with urllib2, Google serves it its home page (google.com), and it means, among other things, that lxml's extraction capabilities cannot be used.

While urllib2 is not the culprit here (perhaps Google does the same with all headless requests), is there any way of getting Google to serve the desired page? A quick tests with the requests library is indicating the same issue.

4

1 回答 1

1

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

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

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

当您加载页面时,您的浏览器会发送请求,https://www.google.com/ncr然后 google 会返回主页。主页包含 javascript 分析散列后的组件并使用它来生成您希望看到的页面。浏览器和 Webdriver 可以这样做,因为它们处理 javascript。如果您在浏览器中禁用 javascript 并转到该链接,您会看到该页面也没有生成。

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

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

于 2015-10-28T00:00:07.683 回答