【问题标题】:Webpage content doesn't match the page's source code网页内容与网页的源代码不匹配
【发布时间】:2015-05-22 04:29:06
【问题描述】:

几周以来,我一直在使用 BeautifulSoup 抓取网页。我最近遇到的一个问题是网页的内容与页面源代码显示的内容以及 url 请求响应中给出的内容不同。

例如,让我们看看 yelp。这 (http://www.yelp.com/search?find_desc=&find_loc=Pittsburgh%2C+PA%2C+USA&ns=1) 将带动宾夕法尼亚州匹兹堡地区的所有 63,000 家企业。如果我们查看页面源代码,我们会看到它与内容匹配(如果您搜索单词 showing,它会找到下面的代码。)

<span class="pagination-results-window">
    Showing 1-10 of 63936
</span>

现在,让我们只看看宾夕法尼亚州匹兹堡地区的餐厅。这将返回结果的数量从 63k 减少到 5k。但是,如果我们查看页面源代码,则会看到上面显示的相同代码。而且,页面源中的第一个返回结果匹配的是63k页面,而不是5k页面。起初,我认为这可能是由于 mozilla 缓存网页内容,但很快通过抓取 5k 餐厅的链接 (http://www.yelp.com/search?find_desc=&find_loc=Pittsburgh%2C+PA%2C+USA&ns=1#cflt=restaurants) 否定了这个想法。结果表明,它收集的 html 生成了包含 63k 家商家的页面,而不是我预期的 5k 家餐馆。

我的问题是这是什么原因造成的?这是由 Yelp 故意完成的,还是由外部原因造成的?我尝试自己查找此内容,但我无法找到任何使用此问题标题中的措辞来解释此问题的内容。

如果您需要更多详细信息,请告诉我,我很乐意提供我遗漏的几行代码。

谢谢!

【问题讨论】:

  • Yelp 与许多响应式网站一样,使用 AJAX 获取更多数据。抓取只能在任何 AJAX 请求完成之前提取原始 HTML。看起来搜索过滤器是在页面加载后应用的。

标签: html web web-scraping beautifulsoup


【解决方案1】:

与许多响应式网站一样,Yelp 使用 AJAX 来获取更多数据和/或使用 jQuery 来执行过滤。抓取只能在执行任何 jQuery 或 AJAX 更新之前提取基本 HTML。


这两个 URL很可能与服务器端代码相同:

搜索?find_desc=&find_loc=匹兹堡%2C+PA%2C+美国&ns=1
search?find_desc=&find_loc=匹兹堡%2C+PA%2C+USA&ns=1#cflt=restaurants

这就是您在两种情况下看到相同的抓取结果的原因。但是,片段 #cflt=restaurants 被客户端 JavaScript 使用并启动一些脚本来过滤结果。

【讨论】:

  • 我想知道 JavaScript 是否可能是造成这种情况的罪魁祸首。现在这是有道理的。谢谢@Drakes!
猜你喜欢
  • 1970-01-01
  • 2021-12-03
  • 2017-06-04
  • 1970-01-01
  • 2017-01-26
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多