找到GitHub上与Java相关的项目
这一步要求:会用搜索,善用搜索。
在GitHub官网的Marketplace和Explore页面中无法找到只与Java有关的所有项目,那么怎么办哪?
在Google中搜索"github java",发现了下面的结果:
点进去后全都是与Java有关的项目:
当然,在这个页面上不可能将所有的Java项目全部展示出来,所以有了下面的"Load more..."按钮:
项目数据爬取
通过上一节可知:
- 项目页面中展示了项目名和start数。
- 一页中显示的项目数有限,如果需要获取更多的项目数据,就需要通过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去获取这些数据哪?
我做了初步判断,有两种可能:
- 代码中访问链接时带的参数不对,导致未返回正确数据
- 请求邮箱等用户信息的数据另有其他链接 根据上文中贴出的搜索关键字的图片发现,邮箱等用户数据的确是通过用户主页链接返回回来的,那么排除掉了第二种可能。
查看一下请求的参数,将请求的Header数据在代码中完全模拟,成功的获取了用户信息。Header数据截图: