python-requests-login-csdn-blog

title: 基于python的requests库,模拟登录csdn博客
date: 2015-05-23 19:06:04
tags:
- python
- csdn
- 模拟登录
- requests
categories:

- python 学习笔记

还是继续我的python学习。以前写的爬虫用的urllib2来实现,也用过scrapy的爬虫框架,这次试试requests,刚开始用,用起来确实比urllib2好,封装的更好一些,使用起来简单方便很多。

安装requests库

在ubuntu下面安装很简单

pip install requests

就搞定了

快速上手的小例子

下面给个快速入门,最简单的例子

import requests
r = requests.get('http://www.baidu.com')
print r.text

这段代码,很简单。
第一行,引入requests库,这是必然的。
第二行,通过get方式获取baidu首页的内容。
第三行,把返回的response内容,输出出来

果然很简单,这样就可以发送一个get请求,同理,你还可以使用
requests.post,requests.put,requests.options,requests.head,发送请求,没错就是这么简单,果然比urllib2好用。

模拟登录csdn

我们需要其他的辅助工具

浏览器:Firefox

浏览器插件:tamper data,firebug

我们需要tamper data来拦截请求,因为chrome没有这个功能的插件,所以这个只能使用firefox来做(除了拦截请求chrome没有,其他的工作都可以用chrome,看个人喜好吧)。

分析登录过程

1 打开登录页面

我们首先打开csdn的登录页面https://passport.csdn.net/account/login?ref=toolbar
这个链接,前面部分是登录的网址,问号后面的参数,顾名思义,referer,就是你从哪里跳过来的,也许是一个页面跳转到登录的,toolbar就是我自己点击顶部导航栏,然后跳转到登录页面的。

2 清除相关的cookie

为了排除不必要的干扰,我们先清除掉所有的相关的cookie,这样方便我们分析哪些参数是必须的。
firefox中,清除cookie

3 登录过程分析

清除了cookie后,我们刷新一下页面https://passport.csdn.net/account/login?ref=toolbar,重新获取对应的cookie。
然后我们就开始用tamper data来拦截请求。
使用tamper data
我们点击start tamper,在网页中填写用户名和密码。点击登录,会发出一个请求,然后tamper data会拦截下这个请求,询问我们是否拦截,点击tamper,我们可以在这个请求提交之前,查看请求的内容,还可以做删改。
发出第一个登录请求前拦截下来,查看表单内容
csdn的登录过程比较简单,发送一个登录表单过去,就登录成功了,不过记得修改headers,这是后话。

4 开始模拟登录

知道登录过程了,我们就开始写登录的代码。

import requests
#使用beautifulsoup来处理获取的html内容,这个库需要安装,还是使用pip install beautifulsoup4来安装
from bs4 import BeautifulSoup as bs
#这个函数使用来提取流水号的
def toJson(str):
    '''
    提取lt流水号,将数据化为一个字典
    '''
    soup = bs(str)
    tt = {}
    #提取form表单中所有的input标签,以字典的形式来保存name:value
    for inp in soup.form.find_all('input'):
        if inp.get('name') != None:
            tt[inp.get('name')] =inp.get('value')
    return tt

#这行代码,是用来维持cookie的,你后续的操作都不用担心cookie,他会自动带上相应的cookie
s = requests.Session()
#我们需要带表单的参数,这里面有个参数lt,登录操作的流水号,我们需要从html页面中进行提取
payload ={'username':'jackroyal','password':'123456','lt':soup["lt"],'execution':'e1s1','_eventId':'submit'}
r = s.post("http://passport.csdn.net/account/login",data=payload,headers=header)
print r.text

ok,至此,登录就成功了

5 优化

当你登录成功后,你会问,我怎么知道登录成功了呢?当你试图去抓取http://write.blog.csdn.net/postlist的内容的时候,你会发现一个403的错误,这是为啥呢?
很简单,user agent没有修改,我们用的是默认的user agent,这可不是一个正常的用户,所以被网站拒绝了。我们加上他就好了

header = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0'}
r = s.post("http://passport.csdn.net/account/login",data=payload,headers=header)
print r.text

后话

上面的代码还是太简单,我们都知道cookie是有有效期的,我在做调试的时候,没修改一次,就要模拟登录一次,这样不好,我们要保存cookie,这样下次就不需要重新发送登录请求了
分享出完整的代码

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import requests
import time
import os
from bs4 import BeautifulSoup as bs
from cookielib import LWPCookieJar


def toJson(str):
    '''
    提取lt流水号,将数据化为一个字典
    '''
    soup = bs(str)
    tt = {}
    for inp in soup.form.find_all('input'):
        if inp.get('name') != None:
            tt[inp.get('name')] =inp.get('value')
    return tt


#cookie setting
s = requests.Session()
s.cookies = LWPCookieJar('cookiejar')
header = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0'}
if not os.path.exists('cookiejar'):
    print "there is no cookie,setting"
    r = s.get("http://passport.csdn.net/account/login")
    soup = toJson(r.text)
    payload ={'username':'jackroyal','password':'123456','lt':soup["lt"],'execution':'e1s1','_eventId':'submit'}

    print payload
    r = s.post("http://passport.csdn.net/account/login",data=payload,headers=header)
    s.cookies.save(ignore_discard=True)

    print r.text
else:
    print "cookie exists,restore"
    s.cookies.load(ignore_discard=True)

#r = s.get("https://passport.csdn.net/content/loginbox/loginapi.js")
r = s.get("http://write.blog.csdn.net/postlist",headers=header)
print r.text

参考文献

1 requests官方文档快速上手——中文版
2 beautifuisoup官方文档
3 python的requests如何保存cookie到文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值