最近写了一个课程助手类Android App,写了一大半的时候发现这个课程助手适用于低频用户场景,如果做一个App反倒不如做成微信公众号。顿时丧失了一半写下去的毅力。那就停下来,把爬取教务处和一些类似网站的过程记录下来。
登录
成功登录教务处网站是拿到后续数据的关键。首先需要知道POST的数据格式。如果有验证码则要爬取验证码,识别之后,携带参数进行POST。在这之中一定要保持在同一会话中,也就是缓存cookie。登录成功后的cookie是获取之后数据的凭证。我常用的网络库为okhttp3,在okhttp3中cookie可以在okhttpclient创建的过程中配置。例如
在saveFromResponse和loadForRequest中分别缓存和提取cookie
在缓存cookie这一块是要根据不同网站来设置的,可能在同一个host不同的path下需要使用同一个cookie。如果使用Map来缓存cookie那就不能简单地用HttpUrl来作为key,否则就可能因为不在同一会话中导致验证码无法通过。
很多教务处的网站的登录并没有做的复杂,只需要简单的POST模拟,注意下缓存cookie就可以继续其他页面的获取。
解析
拿到数据之后,下一步就是从html页面中解析出想要的数据。我用过的页面解析包邮Jsoup和HtmlUnit。相比较Jsoup更加轻量化。Jsoup有很多很强大的API来帮助操作DOM,CSS,对于复杂的结构还可以使用选择器(selector)来提取,但一些网站会异步加载数据,这样会导致拿到的html页面并不是最终和在浏览器中看到一致,数据也不全。这时候就要用另一大利器HtmlUnit,它支持JS,CSS,所以操作HtmlUnit就像操作一个浏览器一样简单。htmlunit
有了利器,就要学着用了。提取复杂数据Jsoup可以使用选择器,HtmlUnit可以使用Xpath。selector和xpath的语法很简单,当然你也可以不学,为什么呢?
因为Chrome可以帮你!
例如
对于如此复杂的界面,只需要:
移动鼠标到想要的数据上 -> 然后轻轻点击鼠标右键 -> 看到COPY复选框 -> 会出现copy as selector 和 copy as xpath。
对于教务处页面的提取,可以看做是爬虫的入门。如果要提取微博这样的复杂地页面,建议从移动端入口,移动端的页面更容易爬取和解析。附一个之前写的垃圾demo /捂脸 垃圾demo