最近期末测试完结了,正好恰逢周末,就想找点事来做,之前做过爬虫,遇到了登录的问题,今天就来整理下。
登录问题其实就是程序发送请求,服务器返回数据时,发出http响应消息报文,这两种类型的消息都是由一个起始行,而cookie就在在http请求和http响应的头信息中,在请求中添加用户信息的cookie即可实现登录。于是乎cookie是消息头的一种很重要的属性。
什么是Cookie?
Cookie的种类
会话Cookie(Session Cookie):这个类型的cookie只在会话期间内有效,保存在浏览器的缓存之中,用户访问网站时,会话Cookie被创建,当关闭浏览器的时候,它会被浏览器删除。
持久Cookie(Persistent Cookie): 这个类型的cookie长期在用户会话中生效。当你设置cookie的属性Max-Age为1个月的话,那么在这个月里每个相关URL的http请求中都会带有这个cookie。所以它可以记录很多用户初始化或自定义化的信息,比如什么时候第一次登录及弱登录态等。
Secure cookie:安全cookie是在https访问下的cookie形态,以确保cookie在从客户端传递到Server的过程中始终加密的。
HttpOnly Cookie :这个类型的cookie只能在http(https)请求上传递,对客户端脚本语言无效,从而有效避免了跨站攻击。
第三方cookie: 第一方cookie是当前访问的域名或子域名下的生成的Cookie。 第三方cookie:第三方cookie是第三方域名创建的Cookie。
python模拟登录
首先查看所要爬取网站登录源码:(豆瓣为例)
看了这些之后,我们只用按照登录网址所需信息添加到post中就行。
添加所需的包。
12345import requestsimport refrom bs4 import BeautifulSoupimport randomimport urllib, urllib2信息添加到post中
1234567891011login_url = "https://accounts.douban.com/login"headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64)\AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36',} my_post = {'redir':'http://www.douban.com/doumail', 'form_email':'*@qq.com', 'form_password':'password', 'login':'登录', }r = requests.post(login_url, data = my_post, headers = headers)html = r.text因为豆瓣登录需要验证码,但是本人并没有做过图像中验证码识别,于是直接正则匹配图片下载到本地,然后手工读取,在输入:
1234567''' download captcha '''reg = r'<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>'imglist = re.findall(reg, html)urllib.urlretrieve(imglist[0], '%d.jpg' % random.randint(1,100))captcha = raw_input('captcha is: ')regid = r'<input type="hidden" name="captcha-id" value="(.*?)"/>'ids = re.findall(regid, html)再次发送
12345''' repost '''my_post["captcha-solution"] = captchamy_post["captcha-id"] = ids[0]q = requests.post(login_url, data = my_post, headers = headers)print q.url
如果登录成功,返回的URL就是:http://www.douban.com/doumail/,然后就可以正在获得用户信息了。
123456789101112131415161718192021''' use bs4 filter douban.com's doumail following'''if q.url == "http://www.douban.com/doumail/": print " login successfully!" soup = BeautifulSoup(q.text) tag = soup.find_all('span', attrs={'class':'from'}) tag2 = soup.find_all('a', attrs={'class':'url'}) a = [] for x in tag: a.append(x.get_text()) b = [] for y in tag2: b.append(y.get_text()) def split(num): print a[num] + ' ' + b[num] print print '-'*30, u'豆瓣豆邮', '-'*30 for x in range(len(a)): split(x) print '-'*80
其实有很多种方法都可以实现,这只是一种,我也是在探索,希望和我一样的人可以一起探讨,请多多指教。
来源:https://www.cnblogs.com/aaronchou820/p/6696255.html