借用cookie进行登录验证的原理
一般情况用户使用浏览器进行登录操作,认证通过后服务器返回给用户一个cookie用来保存登录态。cookie是一些经过加密的键值对,在服务器端解密后能够提取到一些用户信息。cookie值在浏览器中按F12键后,输入密码点击登录后可以查看。如下图所示:
利用requests包进行登录代理
我们首先将浏览器里复制到的cookie字符串进行处理,转化成为Python的字典格式。
然后就是拼接要爬取页面的url字符串
有了爬取页面的url之后,利用requests模块将url和cookie发送给服务端
如果上一步执行顺利的话,s.text事实上已经是登录后网页的源码了。为了方便提取数据,我们引入etree模块,对s.text进行转换,这样就能利用xpath对标签进行精准选择了。
获取标签xpath。chrome浏览器鼠标在目标内容处右键->查看->在高亮源码处右键->copy->xpath。selector.xpath()返回值是一个list,千万要注意呀!
#coding=utf-8
import re
import os
import time
import sys
import re
import urllib2
import urllib
import requests
import cookielib
from lxml import etree
reload(sys)
sys.setdefaultencoding("utf8")
####################################
if __name__ == '__main__':
cookies = {}
raw_cookies = """
# your own cookies here!
"""
for line in raw_cookies.split(';'):
key, value = line.split('=', 1)
cookies[key]=value
#print cookies
for i in range(1, 45):
if (i == 1):
myurl="http://rs.xidian.edu.cn/home.php?mod=spacecp&ac=plugin&id=bt:history"
s = requests.get(myurl, cookies=cookies)
selector = etree.HTML(s.text)
for j in range(9, 32):
with open('1.txt', 'a') as f:
f.write(selector.xpath('//*[@id="ct"]/div[1]/div/div[1]/table/tbody/tr['+str(j)+']/td[3]')[0].text+'\r\n')
f.close()
else :
myurl = "http://rs.xidian.edu.cn/home.php?mod=spacecp&ac=plugin&id=bt:history&page="+str(i)
s = requests.get(myurl, cookies=cookies)
selector = etree.HTML(s.text)
for j in range(2, 32):
with open('1.txt', 'a') as f:
f.write(selector.xpath('//*[@id="ct"]/div[1]/div/div[1]/table/tbody/tr['+str(j)+']/td[3]')[0].text+'\r\n')
f.close()
如果过程顺利的话,这时候应该已经在 1.txt 文件里有我们想要的数据了。本文将数据的获取和处理解耦合,至于怎么处理,排成怎样的格式,有太多方法。