php抓取网页title(开源库PHPDOMParser的核心代码解析方法解析)
优采云 发布时间: 2022-04-03 10:27php抓取网页title(开源库PHPDOMParser的核心代码解析方法解析)
GitHub:github_trending_crawler
介绍
由于GitHub官方提供的API不收录GitHub Trending相关接口,作为好学的开发者,大家都会关注Trending Trending,获取GitHub上相关编程语言的最新项目和开发者。此外,我们在开发第三方 GitHub App 时,通常还需要展示 Trending 数据。如果我们直接在客户端捕获解析,那就吃力不讨好,国内访问速度慢。这时,服务器需要提供相关的接口来解决问题。.
本仓库提供了一个小型的PHP爬虫,用于周期性的抓取和解析服务器上的GitHub Trending数据并缓存,从而为客户端提供一个快速(秒级)的查询接口。可以从Daily、Weekly、Monthly三个维度抓取各种编程语言中最受关注的Repositories和Developers。
阐明
这个小爬虫的核心代码主要是爬虫文件夹下的simple_html_dom.php和github_trending_crawler.php这两个文件。
simple_html_dom.php
该文件来自开源库PHP Simple HTML DOM Parser,提供了简单易用、功能强大的HTML DOM解析方法,方便我们使用PHP抓取网页的HTML并进行分析.
github_trending_crawler.php
该文件主要用于抓取和解析 GitHub Trending 数据,包括以下方法:
该方法需要传入一个url参数,用于获取指定url下的HTML,并返回一个simple_html_dom对象,方便后续解析HTML中不同标签中的数据。
该方法用于获取GitHub Trending页面右侧推荐的当前流行编程语言(注意:每个人在登录状态下看到的结果可能会有所不同,此方法是在未登录时捕获的) ,并返回一个languages数组,数组中的每一项都收录name和id两个字段,大致如下:
1
{"languages":[{"name":"C++","id":"c++"},{"name":"PHP","id":"php"}, ... ]}
该方法用于获取 GitHub 的所有编程语言,同时返回一个结构类似上述的语言数组。
该方法接收两个参数lang和since,其中lang的值来自上述语言返回的id,since的值包括daily、weekly、monthly,用于获取指定时间内最关注的编程语言方面。的开源项目,返回一个仓库数组,大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"repositories": [{
"author": "airbnb",
"title": "lottie-ios",
"url": "https://github.com/airbnb/lottie-ios",
"description": "An iOS library to natively render After Effects vector animations",
"language": "Objective-C",
"stars": "13,084",
"forks": "1,683",
"newStars": "25 stars today",
"contributors": [{
"id": "buba447",
"avatar": "https://avatars1.githubusercontent.com/u/1163980"
}, {
"id": "welshm",
"avatar": "https://avatars0.githubusercontent.com/u/3903024"
}, {
"id": "valeriyvan",
"avatar": "https://avatars0.githubusercontent.com/u/1630974"
}, {
"id": "hansemannn",
"avatar": "https://avatars3.githubusercontent.com/u/10667698"
}, {
"id": "fnazrala",
"avatar": "https://avatars2.githubusercontent.com/u/2164816"
}]
},
...
]}
该方法还接收两个参数lang和since,其值类似于gt_get_repositories()方法的值。用于获取一种编程语言在指定时间维度下最受欢迎的开发者,并返回一个开发者数组,大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"developers": [{
"url": "https://github.com\/facebook",
"avatar": "https://avatars2.githubusercontent.com/u/69631",
"name": "Facebook",
"id": "facebook",
"repository": {
"url": "https://github.com/facebook/Shimmer",
"title": "Shimmer",
"desp": "An easy way to add a simple, shimmering effect to any view in an iOS app."
}
},
...
]}
注意:如果 GitHub Trending 访问失败、超时,或者页面没有某个维度的数据,或者解析异常,上述方法会返回 null,如果 GitHub Trending 页面的 HTML 结构发生变化以后,上述方法的解析逻辑也应该做相应的修改。
使用示例
为了方便正确使用github_trending_crawler.php,我写了一个示例脚本example.php,
把爬虫文件夹和example.php文件放到你的Web目录下,访问如下URL路径,就可以得到对应的结果。具体逻辑请参考example.php文件,不再赘述(在PHP 5. 6 测试通过)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 默认获取今日所有编程语言下开源项目的 Trending 数据
https://path/to/example.php
// 获取今日 Swift 语言下开源项目的 Trending 数据
https://path/to/example.php?lang=swift&since=daily
// 获取本月 Swift 语言下开源项目的 Trending 数据
https://path/to/example.php?action=repositories&lang=swift&since=monthly
// 获取本周 Objective-C 语言下开发者的 Trending 数据
https://path/to/example.php?action=developers&lang=objective-c&since=weekly
// 获取最受关注的编程语言和所有的编程语言列表
https://path/to/example.php?action=top_languages
https://path/to/example.php?action=all_languages
其中,URL的查询请求参数默认值如下:
当然,每次访问example.php脚本都实时取数据显然是很费时间的,而且GitHub Trending页面的更新频率也不是很快,所以我们可以通过Redis将数据缓存在服务器端,下次访问,如果缓存中有数据,直接返回,可以大大提高访问速度。有关详细信息,请参阅 example_with_redis.php 文件。
另外,你可以在你的服务器上启动一些crontab定时任务,定时抓取数据更新缓存,这样提供给客户端的接口可以快速响应。
请注意,如果您的 PHP 脚本在执行过程中报告以下错误:
1
file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version in /path/to/simple_html_dom.php on line 75.
这是因为自 2018 年 2 月 1 日起,GitHub 将 HTTPS 访问限制为仅 TLSv1.2,请参阅此处了解详细信息,因此您可能需要更新服务器的 OpenSSL 版本。
测试界面
为了让大家更直观的感受一下上面这个小爬虫的效果,我在自己的服务器上部署了一个环境。您可以直接访问以下示例 URL 以获取相关结果:
// 默认获取所有编程语言的开源项目今日趋势数据
// 获取当今 Swift 语言开源项目的 Trending 数据
// 获取本月 Swift 语言开源项目的 Trending 数据
// 获取本周开发者在 Objective-C 中的 Trending 数据
// 获取最受关注的编程语言列表
// 获取所有编程语言的列表
重要提示:第一次访问上述接口获取相关数据时,如果缓存中有数据,则直接返回;如果缓存中没有数据,则会实时抓取GitHub Trending页面数据进行解析和缓存。这时候界面返回的速度会变慢。另外,因为是用来测试的,一旦缓存了数据,我并没有定期更新,所以上面测试接口返回的数据有时可能会过期。
!!!以上界面仅供大家体验,不建议直接在你的服务或app中使用,因为我随时可能离线。
顺便一提
如果你问我为什么我用 PHP 而不是 Python 来写爬虫,那当然是因为 PHP...
图片来自《神秘程序员》
执照
这个存储库是在 MIT 许可下发布的。有关详细信息,请参阅许可证。