2

使用 Python,我想在来源很大的网页上抓取数据(它是某个用户的 Facebook 页面)。

假设 URL 是我要抓取的 URL。我运行以下代码:

import urllib2

usock = urllib2.urlopen(url)
data = usock.read()
usock.close()

数据应该包含我正在抓取的页面的来源,但由于某种原因,当我直接与页面的来源进行比较时,它不包含所有可用的字符。我不知道我做错了什么。我知道我要抓取的页面最近没有更新,所以这不是因为我丢失了一些最近的数据。

有人有线索吗?

编辑:我缺少的信息是这样的:

<code class="hidden_elem" id="up82eq_33"><!-- <div class="mbs profileInfoSection"><div class="uiHeader uiHeaderTopAndBottomBorder uiHeaderSection infoSectionHeader"><div class="clearfix uiHeaderTop"><div><h4 tabindex="0" class="uiHeaderTitle">Basic Information</h4></div></div></div><div class="phs"><table class="uiInfoTable mtm profileInfoTable uiInfoTableFixed"><tbody><tr><th class="label">Networks</th><td class="data"><div class="uiCollapsedList uiCollapsedListHidden" id="up82eq_32"><span class="visible">XXXX</span></div></td></tr></tbody></table></div></div> --></code>

基本上是一些我感兴趣的领域。让我吃惊的是我可以得到一些领域,但不是全部。

4

2 回答 2

2

Facebook 主要面向 Javascript。您在浏览器中看到的页面源是任何 JS 代码运行后的 DOM 并且页面源无论如何都会经常更改)。您可能必须使浏览器自动化(使用 Selenium),或尝试其他工具,例如 mechanize... 或查看合适的 FB 应用程序并使用 FB API。

于 2012-07-24T10:21:53.323 回答
2

这个页面可能会执行一些 javascript 并且 javascript 会生成一些内容。
试试斜纹布
它基于Mechanize,但执行 javascript。
Python中的示例:

from twill.commands import *
go("http://google.com/")
fv("f", "q", "test")
submit("btnG")
info() #shows page info
show() #shows html

另一种选择是在 Node.js上使用Zombie.js 。
这个库比斜纹更好,它是无浏览器的解决方案。
Coffeescript 中的示例:

zombie = require "zombie"
browser = new zombie()
browser.visit "https://www.google.ru/", =>
    browser.fill "q", "node.js"
    browser.pressButton "Поиск в Google", ->
        for item in browser.queryAll "h3.r a"
            console.log item.innerHTML
于 2012-07-24T10:20:23.070 回答