前几天无聊写了个小爬虫爬强智教务系统(额,这个,不知道会不会被请喝茶,所以纠结这个模块到底开源还是不开源),然后咧,发现第一次访问的时候特别快,然后登录也特别快,但是获取成绩的时候特别的慢,测试了一下要20s左右,这尼玛能忍?于是就展开了长路漫漫的找bug路程。

首先,是不是函数内部问题?返回值数据太多?不太可能!我都用了成员变量来测试,照样慢!那是处理数据的问题?循环超时?也不是啊。那就一步一步debug好了,1,2,3,发现是下面这段代码出了问题:

html = requests.post(url=url_courses, headers=config.headers, cookies=self.cookies)

what?难道是服务器有反爬机制?时间太快导致服务器判断成了爬虫所以给了我这么一个陷阱?那我就sleep一下还不行吗?

time.sleep(1)

what?还是不行?那就

time.sleep(5)

我就不信没有人能在5秒之内查到成绩的,毕竟那么多单身狗是吧(虽然我也是其中一员咯(逃~),啊啊啊~服务器没有用时间反爬虫的机制~害我白等了这么久,难道是其他headers数据里面有参数验证?待本大人给你探探,

Content-Length:26

嗯,有点可疑,给你来个验证好了........又不是这个问题,算了,百度一下吧,百度不到,额,这点小问题不用google了吧,再回去看看。

想想,post是要发送一些data数据的,不可能是data数据太多导致,毕竟这些都是必要的数据好吗,啊,对了,会不会是headers数据太多导致发送请求太慢啊,于是决定对headers进行瘦身(为什么是瘦身呢,因为headers有些数据是不能删除的,这个我们等下解释。),瘦身成功,运行,唰的一声,哈哈哈哈哈,果然是headers数据太多的原因,1s不到就出数据了,一颗赛艇!明天中秋节给自己加个鸡腿,还有月饼,哈哈~~~


对于headers瘦身的问题,我们来聊聊,大概是这么个情况(下面的headers数据是处理过的,没有敏感信息):

  1. Accept:
    text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  2. Accept-Encoding:
    gzip, deflate, sdch
  3. Accept-Language:
    zh-CN,zh;q=0.8
  4. Connection:
    keep-alive
  5. Cookie:
    Cookie=233CF9EF5A23CF9EF3CF9EF3CF9EF
  6. Host:
    192.168.1.1
  7. Referer:
    http://192.168.1.1/login/
  8. Upgrade-Insecure-Requests:
    1
  9. User-Agent:
    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36

我们看,

User-Agent肯定是不能少的,毕竟这个是模拟浏览器,没有浏览器一下就被知道是爬虫了,

Accept什么的没用,

Accept-Encoding还是别删了,后面的gzip是能压缩网页内容的咧,大大减少我们的数据量接收,节约时间,

Accpet-Language这个,这网页应该没有自动翻译功能吧,不要也罢

Connection:keep-alive,这个也别删吧,保持连接感觉挺好的,具体什么功能去问专门搞web开发的同学吧,

Cookie,我们好像在post里面传入了cookie,所以这个也不要,

Host:没什么用吧,服务端又不验证,

Referer,这个还是要用一下,毕竟有时候会验证跨站提交

Upgrade-Insecure-Requests,这个我专门去查了一下,是在Chrome Beta 43里面开始出现,即在启用升级非安全请求后,HTTP会被作为HTTPS对待。好像也没什么卵用啊,删!

好,瘦身成功,网页返回数据的时间也快了。