返回介绍

9.2 Facebook

发布于 2024-02-05 23:37:18 字数 2748 浏览 0 评论 0 收藏 0

目前,从月活用户数维度来看,Facebook是世界上最大的社交网络之一,因此其用户数据非常有价值。

9.2.1 网站

图9.5所示为Packt出版社的Facebook页面,其网址为https://www. facebook.com/PacktPub 。

图9.5

当你查看该页的源代码时,可以找到最开始的几篇日志,但是后面的日志只有在浏览器滚动时才会通过AJAX加载。另外,Facebook还提供了一个移动端界面,正如第1章所述,这种形式的界面通常更容易抓取。该页面在移动端的网址为https://m.facebook.com/PacktPub ,如图9.6所示。

图9.6

当我们与移动端网站进行交互,并使用Firebug查看时,会发现该界面使用了和之前相似的结构用于处理AJAX事件,因此该方法实际上无法简化抓取。虽然这些AJAX事件可以被逆向工程,但是不同类型的Facebook页面使用了不同的AJAX调用,而且依据我的过往经验,Facebook经常会变更这些调用的结构,所以抓取这些页面需要持续维护。因此,如第5章所述,除非性能十分重要,否则最好使用浏览器渲染引擎执行JavaScript事件,然后访问生成的HTML页面。

下面的代码片段使用Selenium自动化登录Facebook,并跳转到给定页面的URL。

from selenium import webdriver

def facebook(username, password, url):
    driver = webdriver.Firefox()
    driver.get('https://www.facebook.com')
    driver.find_element_by_id('email').send_keys(username)
    driver.find_element_by_id('pass').send_keys(password)
    driver.find_element_by_id('login_form').submit()
    driver.implicitly_wait(30)
    # wait until the search box is available,
    # which means have successfully logged in
    search = driver.find_element_by_id('q')
    # now logged in so can go to the page of interest
    driver.get(url)
    # add code to scrape data of interest here ...

然后,可以调用该函数加载你感兴趣的Facebook页面,并抓取生成的HTML页面。

9.2.2 API

如第1章所述,抓取网站是在其数据没有给出结构化格式时的最末之选。而Facebook提供了一些数据的API,因此我们需要在抓取之前首先检查一下Facebook提供的这些访问是否已经满足需求。下面是使用Facebook的图形API从Packt出版社页面中抽取数据的代码示例。

>>> import json, pprint
>>> html = D('http://graph.facebook.com/PacktPub')
>>> pprint.pprint(json.loads(html))
{u'about': u'Packt Publishing provides books, eBooks, video
    tutorials, and articles for IT developers, administrators, and
        users.',
u'category': u'Product/service',
u'founded': u'2004',
u'id': u'204603129458',
u'likes': 4817,
u'link': u'https://www.facebook.com/PacktPub',
u'mission': u'We help the world put software to work in new ways,
    through the delivery of effective learning and information
        services to IT professionals.',
u'name': u'Packt Publishing',
u'talking_about_count': 55,
u'username': u'PacktPub',
u'website': u'http://www.PacktPub.com'}

该API调用以JSON格式返回数据,我们可以使用json 模块将其解析为Python的dict 类型。然后,我们可以从中抽取一些有用的特征,比如公司名、详细信息以及网站等。

图形API还提供了很多访问用户数据的其他调用,其文档可以从Facebook的开发者页面中获取,网址为https://developers.facebook.com/ docs/graph-api 。不过,这些API调用多数是设计给与已授权的Facebook用户交互的Facebook应用的,因此在抽取他人数据时没有太大用途。要想得到更加详细的信息,比如用户日志,仍然需要爬虫。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文