网页内容与网页源代码不符

Webpage content doesn't match the page's source code

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

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

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

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

我的问题是这是什么原因造成的?这是 Yelp 故意为之还是由外部原因造成的?我试过自己查找,但我找不到任何可以使用问题标题中的措辞来解释这一点的内容。

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

谢谢!

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


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

search?find_desc=&find_loc=Pittsburgh%2C+PA%2C+USA&ns=1
search?find_desc=&find_loc=Pittsburgh%2C+PA%2C+USA&ns=1#cflt=restaurants

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