js 抓取网页内容(Facebook是如何演示浏览器和API的使用的?(组图))
优采云 发布时间: 2022-01-15 18:10js 抓取网页内容(Facebook是如何演示浏览器和API的使用的?(组图))
为了演示浏览器和 API 的使用,我们将查看 Facebook 的 网站。目前,就月活跃用户而言,Facebook 是全球最大的社交网络之一,因此其用户数据非常有价值。
1网站
图 1 显示了 Packt Press Facebook 页面。
查看页面源码时,可以发现前几条日志,但后面的日志只有在浏览器滚动时才通过 AJAX 加载。此外,Facebook 提供了一个移动界面,如第一章所述,这种形式的界面通常更容易抓取。该页面在移动端的显示形式如图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 页面。
2Facebook API
正如第 1 章所讨论的,当数据没有被赋予结构化格式时,抓取 网站 是最后的手段。Facebook 确实为绝大多数公共或私人(通过您的用户帐户)数据提供了 API,因此在构建增强的浏览器抓取之前,我们需要首先检查这些 API 提供的访问权限是否足够。
首先要做的是确定可以通过 API 获得哪些数据。为了解决这个问题,我们需要先查阅它的 API 文档。开发人员文档位于 ,其中提供了所有不同类型的 API,包括 Graph API,其中收录我们想要的信息。如果您需要与 Facebook 建立其他交互(通过 API 或 SDK),您可以随时查阅文档,该文档定期更新且易于使用。
另外,根据文档链接,我们还可以使用浏览器内的 Graph API 探索工具。如图 3 所示,探索工具是测试查询及其结果的好地方。
图 3
在这里我可以搜索 API 以获取 PacktPub 的 Facebook 页面 ID。图形浏览器工具也可以用来生成访问令牌,我们可以用它来定位 API。
要在 Python 中使用 Graph API,我们需要使用特殊的访问令牌来处理更高级的请求。幸运的是,我们可以使用一个维护良好的名为 facebook-sdk() 的库。我们只是通过 pip 安装它。
pip install facebook-sdk
下面是使用 Facebook 的 Graph API 从 Packt Press 页面提取数据的代码示例。
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'}
我们可以看到与基于浏览器的图形探索工具相同的结果。我们可以通过传递我们想要提取的额外信息来获取页面上的更多信息。要确定要使用哪些信息,我们可以在图表文档的页面上查看所有可用字段。使用关键字参数字段,我们可以从 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': "We've 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 字典,我们可以轻松解析。
Graph API 还提供了许多其他调用来访问用户数据,相关文档可以从 Facebook 的开发人员页面获取。根据所需的数据,您可能还需要创建 Facebook 开发者应用程序以获取更持久的访问令牌。