数据爬取实战 —— 爬取GitHub上用户的邮箱

找到GitHub上与Java相关的项目

这一步要求:会用搜索,善用搜索

在GitHub官网的Marketplace和Explore页面中无法找到只与Java有关的所有项目,那么怎么办哪?

在Google中搜索"github java",发现了下面的结果:

点进去后全都是与Java有关的项目:

当然,在这个页面上不可能将所有的Java项目全部展示出来,所以有了下面的"Load more..."按钮:

项目数据爬取

通过上一节可知:

  1. 项目页面中展示了项目名和start数。
  2. 一页中显示的项目数有限,如果需要获取更多的项目数据,就需要通过Load more获取更多数据。

页面数据爬取我使用的是Java三方库:

<dependency>
    <groupId>net.dongliu</groupId>
    <artifactId>requests</artifactId>
    <version>4.18.2</version>
</dependency>

HTML解析我使用的是Java三方库:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.11.3</version>
</dependency>

如果要通过程序自动爬取更多的项目数据,需要费分析"Load more..."按钮,通过程序模拟它。使用chrome访问页面,打开"开发者工具",切换到Network选项卡,然后点击按钮,发现请求的链接及其响应的数据:

通过Jsoup解析响应的HTML页面。

如果我们代码调用这个链接,那么需要知道链接中的"utf8"和"after"来自于哪里。经过分析,这两个值在HTML中存在,每次Load more,服务端都会返回这两个字段的新值。

读取项目的Contributors

知道了项目,那么还需要知道项目的Contributors。在上一节中解析HTML中的项目链接,访问项目的contributors页面,可以看到贡献者列表:

我们需要爬取这个列表,然后访问贡献者的用户页面。

贡献者列表是在页面加载后异步请求的,具体的异步链接地址可通过搜索关键字定位到,例如:

想要通过这个链接正确的获取数据,需要访问的时候填入正确的Header。

GitHub用户页面爬取

打开一个GitHub用户的主页,在主页上可以看到他的邮箱,查看一下邮箱数据所在的元素:

通过上面截图中发现,itemprop等于homeLocation是里面的内容是用户地址,itemprop等于email的里面的内容是用户邮箱。

知道页面中数据存在的位置以后,通过requests库访问主页链接获取页面数据,请求语句:

new String(Requests.newRequest(Methods.GET, <url>).timeout(<timeout>).requestCharset(StandardCharsets.UTF_8).send().charset(StandardCharsets.UTF_8).readToBytes())

但是,请求返回的页面数据中并没有发现上面提到的关键字。这说明我们请求的姿势不对。

在chrome浏览器中打开开发者工具,打开Network标签页搜索关键字,第一次直接以邮箱,发现没有搜到到数据:

这只说明一个问题:服务的返回的邮箱数据被加密了,直接搜索是搜不到的。

邮箱解码

没关系,我们搜其他关键字:

这次发现了邮箱数据,邮箱的数据的确被加密。那么如何解密哪?

这个邮箱加密后的结果很奇怪,不像是AES,DES等加密算法加密后的样子,也不像Unicode编码,它像是转义字符,并且每个值通过分号(";")分隔。经过分析发现将每个值的前缀"&#"和后缀";"去掉后,是一个十六进制数。经过对这个十六进制数据进行观察分析,看起来像是ASCII码,查询了一下ASCII码表印证了分析。将邮箱加密数据进行ASCII解码后,即可得到明文我邮箱。

数据请求链接

现在还有一个问题:邮箱数据有,但是上文提到直接通过requests库访问用户主页是拿不到邮箱数据的。那么我如何通过URL去获取这些数据哪?

我做了初步判断,有两种可能:

  1. 代码中访问链接时带的参数不对,导致未返回正确数据
  2. 请求邮箱等用户信息的数据另有其他链接 根据上文中贴出的搜索关键字的图片发现,邮箱等用户数据的确是通过用户主页链接返回回来的,那么排除掉了第二种可能。

查看一下请求的参数,将请求的Header数据在代码中完全模拟,成功的获取了用户信息。Header数据截图:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章