为的是模拟应用程序和API的采用,他们Sonbhadra研究Facebook的中文网站。目前,从月活使用者数量层次上看,Facebook是当今世界上最小的SNS互联网众所周知,因而其使用者数量据极为有用。
1 中文网站
图1右图为Packt杂志社的Facebook网页。
当你查阅存档的源码时,能找出最开始的两篇笔记,但前面的笔记多于在应用程序慢速TNUMBERV12V4会通过AJAX读取。除此之外,Facebook还提供更多了一个终端端介面,正像第1章所说,这种方式的界面一般来说更容易截取。该网页在终端端展现方式如图9.6右图。
图1
图2
当他们与终端端中文网站进行可视化,并采用应用程序辅助工具查阅时,会辨认出该介面采用了和以后相近的内部结构来处理AJAX该事件,因而该方式难以精简截取。虽然那些AJAX该事件能被逆向工程,但相同类别的Facebook网页采用了相同的AJAX初始化,所以依照我的甚或实战经验,Facebook时常会更改那些初始化的内部结构,所以截取那些网页须要稳步保护。因而,如第5章所说,假如操控性极为重要,不然最合适采用应用程序图形发动机继续执行JavaScript该事件,接着出访聚合的HTML网页。
上面的标识符短片采用Selenium智能化登入Facebook,并重定向到取值网页的URL。
from selenium import webdriver def get_driver(): try: return webdriver.PhantomJS() except: return webdriver.Firefox() def facebook(username, password, url): driver = get_driver() driver.get(https://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(loginbutton).submit() driver.implicitly_wait(30) # wait until the search box is available, # which means it has successfully logged in search = driver.find_element_by_name(q) # now logged in so can go to the page of interest driver.get(url) # add code to scrape data of interest here ...接着,能初始化该函数读取你感兴趣的Facebook网页,并采用合法的Facebook邮箱和密码,截取聚合的HTML网页。
2 Facebook API
如第1章所说,截取中文网站是在其统计数据没有给出内部结构化格式时的最末之选。而Facebook确实为绝大多数公共或私有(通过你的使用者账号)统计数据提供更多了API,因而他们须要在构建加强的应用程序截取以后,首先检查一下那些API提供更多的出访是否已经能够满足需求。
首先要做的事情是确定通过API哪些统计数据是可用的。为的是解决该问题,他们须要先查阅其API文档。开发者文档的网址为
https://developers.facebook.com/docs,在这里给出了所有相同类别的API,包括图谱 API,该API中包含了他们想要的信息。如果你须要构建与Facebook的其他可视化(通过API或SDK),能随时查阅该文档,该文档会定期更新并且易于采用。此外,根据文档链接,他们还能采用应用程序内的图谱 API探索辅助工具,其地址为
https://developers.facebook.com/tools/explorer/。如图3右图,探索辅助工具是用来测试查询及其结果的很好的地方。图3
在这里,我能搜索API,获取PacktPub的Facebook网页ID。图谱探索辅助工具还能用来聚合出访口令,他们能用它来定位API。
想要在Python中采用图谱API,他们须要采用具有更高级请求的特殊出访口令。幸运的是,有一个名为facebook-sdk(
https://facebook-sdk.readthedocs.io)的保护良好的库能供他们采用。他们只需通过pip安装它即可。 pip install facebook-sdk上面是采用Facebook的图谱API从Packt杂志社网页中抽取统计数据的标识符示例。
In [1]: from facebook import GraphAPI In [2]: access_token = .... # insert your actual token here In [3]: graph = GraphAPI(access_token=access_token, version=2.7) In [4]: graph.get_object(PacktPub) Out[4]: {id: 204603129458, name: Packt}他们能看到和基于应用程序的图谱探索辅助工具相同的结果。他们能通过传递想要抽取的额外信息,来获得网页中的更多信息。要确定采用哪些信息,他们能在图谱文档中看到网页中所有可用的字段,文档地址为
https://developers.facebook.com/docs/graph-api/reference/page/。采用关键字参数fields,他们能从API中抽取那些额外可用的字段。In [5]: graph.get_object(PacktPub, fields=about,events,feed,picture) Out[5]: {about: Packt provides software learning resources, from eBooks to video courses, to everyone from web developers to data scientists., feed: {data: [{created_time: 2017-03-27T10:30:00+0000, id: 204603129458_10155195603119459, message: "Weve teamed up with CBR Online to give you a chance to win 5 tech eBooks - enter by March 31! http://bit.ly/2mTvmeA"}, ... id: 204603129458, picture: {data: {is_silhouette: False, url: https://scontent.xx.fbcdn.net/v/t1.0-1/p50x50/14681705_10154660327349459_7 2357248532027065_n.png?oh=d0a26e6c8a00cf7e6ce957ed2065e430&oe=59660265}}}他们能看到该响应是格式良好的Python字典,他们能很容易地进行解析。
图谱API还提供更多了很多出访使用者数量据的其他初始化,其文档能从Facebook的开发者网页中获取,网址为
https://developers.facebook.com/docs/graph-api。根据所需统计数据的相同,你可能还须要创建一个Facebook开发者应用,从而获得可用时间更长的出访口令。