php抓取网页title(开源库PHPDOMParser的核心代码解析方法解析)

优采云 发布时间: 2022-04-03 10:27

  php抓取网页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 许可下发布的。有关详细信息,请参阅许可证。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线