由于您看起来像是先尝试后提问的类型(这是一件非常好的事情),所以我不会给您答案,而是提供有关如何找到答案的(非常详细的)指南。
问题是,除非您是雅虎开发人员,否则您可能无权访问您要抓取的源代码。也就是说,您并不确切地知道该网站是如何构建的,以及您作为用户向该网站发出的请求在服务器端是如何处理的。但是,您可以研究客户端并尝试模拟它。我喜欢使用 Chrome 开发者工具来实现此目的,但您也可以使用其他工具,例如 FF firebug。
所以首先我们需要弄清楚发生了什么。因此,它的工作方式是,您单击“显示评论”,它会加载前十条评论,然后您每次都需要继续单击接下来的十条评论。但请注意,所有这些单击不会将您带到不同的链接,而是生动地获取评论,这是一个非常简洁的 UI,但对于我们的情况需要更多的工作。我可以立即说出两件事:
- 他们使用 JavaScript 来加载评论(因为我停留在同一页面上)。
- 每次您单击时,它们都会通过 AJAX 调用动态加载它们(这意味着每次单击时,它都会向数据库发出另一个请求,而不是随页面加载注释并仅向您显示它们)。
现在让我们右键单击并检查该按钮上的元素。它实际上只是一个带有文本的简单跨度:
<span>View Comments (2077)</span>
通过查看它,我们仍然不知道它是如何生成的或者单击时它会做什么。美好的。现在,保持开发工具窗口打开,让我们单击它。这样就打开了前十名。但事实上,有人要求我们取回它们。 chrome devtools 记录的请求。我们查看开发工具的网络选项卡,看到很多令人困惑的数据。等等,这是一个有道理的:
http://news.yahoo.com/_xhr/contentcomments/get_comments/?content_id=42f7f6e0-7bae-33d3-aa1d-3dfc7fb5cdfc&_device=full&count=10&sortBy=highestRated&isNext=true&offset=20&pageNumber=2&_media.modules.content_comments.switches._enable_view_others=1&_media.modules.content_comments.switches._enable_mutecommenter=1&enable_collapsed_comment=1
See? _xhr http://en.wikipedia.org/wiki/XMLHttpRequest然后获取评论。这很有意义。在浏览器中访问该链接给了我一个 JSON 对象(看起来像 python 字典),其中包含该请求获取的所有十条评论。现在这就是您需要模拟的请求,因为那是给你你想要的东西的那个。首先,让我们将其转换为人类可以阅读的一些正常请求:
go to this url: http://news.yahoo.com/_xhr/contentcomments/get_comments/
include these parameters: {'_device': 'full',
'_media.modules.content_comments.switches._enable_mutecommenter': '1',
'_media.modules.content_comments.switches._enable_view_others': '1',
'content_id': '42f7f6e0-7bae-33d3-aa1d-3dfc7fb5cdfc',
'count': '10',
'enable_collapsed_comment': '1',
'isNext': 'true',
'offset': '20',
'pageNumber': '2',
'sortBy': 'highestRated'}
现在这只是一个反复试验的问题。不过,这里有几点需要注意:
显然,计数决定了您收到的评论数量。我尝试将其更改为 100 以查看会发生什么情况,但收到了错误的请求。它很高兴告诉我原因 - “偏移量应该是总行数的倍数”。现在我们了解了如何使用offset
content_id 可能是标识您正在阅读的文章的内容。这意味着您需要以某种方式从原始页面获取它。试着稍微挖掘一下,你就会找到它。
另外,您显然不想一次获取 10 条评论,因此找到一种以某种方式获取总评论数的方法可能是个好主意(要么找出页面如何获取它,要么只是从内部获取它)文章本身)
使用开发工具,您可以访问所有客户端脚本。因此,通过挖掘,您可以发现指向 /get_comments/ 的链接保存在名为 YUI 的 javascript 对象中。然后,您可以尝试了解它是如何发出请求的,并尝试模仿它(尽管您可能可以自己弄清楚)
您可能需要克服一些安全措施。例如,您可能需要原始文章中的会话密钥才能访问评论。这用于防止直接访问网站的某些部分。我不会用细节来麻烦您,因为在这种情况下这似乎不是问题,但您确实需要注意它,以防它出现。
最后,你必须解析 JSON 对象(Python 有优秀的内置工具),然后解析你得到的 html 注释(你可能想查看一下美丽汤 http://www.crummy.com/software/BeautifulSoup/).
正如您所看到的,这需要一些工作,但尽管我写了这么多,但这也不是一项极其复杂的任务。
所以不要惊慌。
只需要不断地挖掘,直到找到金子(另外,具备一些基本的 WEB 知识也没什么坏处)。然后,如果您遇到障碍并且确实无法继续前进,请回到这里,再次询问。有人会帮助你。
祝你好运!