python爬虫之模拟登陆csdn的实例代码


Posted in Python onMay 18, 2018

python模拟登陆网页主要使用到urllib、urllib2、cookielib及BeautifulSoup等基本模块,当然进阶阶段我们还可以使用像requests等更高级一点的模块。其中BeautifulSoup模块在匹配html方面,可以很好的代替re,使用起来更方便,对于不会使用正则的人来说是福音。

本文使用python2.7

原理

模拟登陆前,我们需要先知道csdn是如何登陆的。我们通过google chrome浏览器先来分析下:

1.chrome浏览器用F12或ctrl+shift+I启动开发者工具,并访问csdn登陆页面,在开发者工具中对”Preserver log”选项打勾,表示跳转时不清楚之前的访问记录。

2.输入用户名密码后,网页进行跳转,此时我们查看访问记录中Method为POST的链接的headers,可以看到

Request header:

Cache-Control:no-cache
Cache-Control:no-store
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html;charset=UTF-8
Date:Fri, 05 Aug 2016 03:51:56 GMT
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Keep-Alive:timeout=20
Pragma:no-cache
Server:openresty
Set-Cookie:UD=%E4%BB%8A%E5%A4%A9%E4%B8%8D%E8%B5%B0%EF%BC%8C%E6%98%8E%E5%A4%A9%E5%8D%B3%E4%BD%BF%E8%B7%91%E4%B9%9F%E4%B8%8D%E4%B8%80%E5%AE%9A%E8%B7%9F%E5%BE%97%E4%B8%8A%EF%BC%81; Domain=.csdn.net; Path=/
Set-Cookie:UserName=yanggd1987; Domain=.csdn.net; Path=/
Set-Cookie:UserInfo=RjXwn4OfICh68ZVTzEjJxlcez5O%2B8RMsVvAiTV6uo4n4q1orcuBFZz29qx%2BUZ7JPFQQivvFGwFaC97NpT%2FKhtcZ2U%2B%2BzivoNtu5nTyg717xzimpeHcoutwnMg%2F5S8ZlARzA8H48TOftvUJUB0mxylQ%3D%3D; Domain=.csdn.net; Path=/
Set-Cookie:UserNick=man8er; Domain=.csdn.net; Path=/
Set-Cookie:AU=A3E; Domain=.csdn.net; Path=/
Set-Cookie:CASTGC=TGT-63516-e4e600adR5WiJAFintPeHqNCpGRvO9w7nHBYtY5XUCc2BPCCcG-passport.csdn.net; Path=/; Secure
Set-Cookie:UN=yanggd1987; Domain=.csdn.net; Expires=Sat, 05-Aug-2017 03:51:55 GMT; Path=/
Set-Cookie:UE="yanggd1987@163.com"; Version=1; Domain=.csdn.net; Max-Age=31536000; Expires=Sat, 05-Aug-2017 03:51:55 GMT; Path=/
Set-Cookie:BT=1470369115868; Domain=.csdn.net; Expires=Sat, 05-Aug-2017 03:51:55 GMT; Path=/
Set-Cookie:access-token=0bd99cf6-c5bf-4683-89b8-9d8678bebff9; Domain=.csdn.net; Path=/
Transfer-Encoding:chunked
Vary:Accept-Encoding

有以上可以看出登陆过程中有cookie

POST提交的数据:

username:XXXXXXXXX
password:XXXXXXXXX
lt:LT-52961-eMo02Bz4tlj3wQz4QMuO173GCIdsqE
execution:e15s1
_eventId:submit

其中username和password表示我们登陆的账户和密码,那lt、execution表示什么呢?不要急,我们看看登陆页面网站的源代码:

<form id="fm1" action="/account/login?from=http%3A%2F%2Fmy.csdn.net%2Fmy%2Fmycsdn" method="post">
   <input id="password" name="password" tabindex="2" placeholder="输入密码" class="pass-word" type="password" value="" autocomplete="off">
   <div class="row forget-password">
   <span class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
    <input type="checkbox" name="rememberMe" id="rememberMe" value="true" class="auto-login" tabindex="4">
    <label for="rememberMe">下次自动登录</label>
   </span>
   <span class="col-xs-6 col-sm-6 col-md-6 col-lg-6 forget tracking-ad" data-mod="popu_26">
    <a href="/account/fpwd?action=forgotpassword&service=http%3A%2F%2Fmy.csdn.net%2Fmy%2Fmycsdn" rel="external nofollow" tabindex="5" target="_blank">忘记密码</a>
   </span>
   </div>
   <!-- 该参数可以理解成每个需要登录的用户都有一个流水号。只有有了webflow发放的有效的流水号,用户才可以说明是已经进入了webflow流程。否则,没有流水号的情况下,webflow会认为用户还没有进入webflow流程,从而会重新进入一次webflow流程,从而会重新出现登录界面。 -->
   <input type="hidden" name="lt" value="LT-53452-VLvC2gjfxdj4jheoUJQRkIXgoDZfc3">
   <input type="hidden" name="execution" value="e16s1"> 
   <input id="username" name="username" tabindex="1" placeholder="输入用户名/邮箱/手机号" value="用户名" class="user-name" type="text"><input type="hidden" name="_eventId" value="submit"> 
   <input class="logging" accesskey="l" value="登 录" tabindex="6" type="button">   
</form>

上面注释的内容就是说明参数lt和execution的,就是在登陆过程中webflow会动态分配一个流水号LT-53452-VLvC2gjfxdj4jheoUJQRkIXgoDZfc3,我们只用获取到这个流水号才能够进行登陆。

从上面通过chrome分析得到,登陆csdn必须有cookie并且获取到webflow分配的流水号;;并且访问时必须有user-agent,否则客户端会被屏蔽。

实现

1.由于我们的系统是centos6.5,默认使用python2.6,因此我们需要先安装python2.7并安装相关第三方模块

(1)yum安装

rpm -Uvh https://centos6.iuscommunity.org/ius-release.rpm
yum -y install python27 python27-devel python27-pip python27-setuptools

#安装相关第三方模块

pip2.7 install beautifulsoup4
pip2.7 install lxml

(2)编译安装

安装python.2.7

wget https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz
tar -zxvf Python-2.7.12.tgz
cd Python-2.7.12
./configure --prefix=/usr/local/python2.7
make && make install
#环境变量
vim /etc/profile
export PATH=/usr/local/python2.7/bin:$PATH
source /etc/profile
#安装setuptools
wget https://pypi.python.org/packages/46/db/baa571da945ff731f3739a119574e89b12add9b05c03842103bd641d0990/setuptools-25.1.3.tar.gz#md5=0dcb9990901cb6e9631db195d4e775a7
tar -zxvf setuptools-25.1.3.tar.gz
cd setuptools-25.1.3
python2.7 setup.py install
#安装pip
wget https://pypi.python.org/packages/e7/a8/7556133689add8d1a54c0b14aeff0acb03c64707ce100ecd53934da1aa13/pip-8.1.2.tar.gz#md5=87083c0b9867963b29f7aba3613e8f4a
tar -zxvf pip-8.1.2.tar.gz
cd pip-8.1.2
python2.7 setup.py install
#安装相关第三方模块
pip2.7 install beautifulsoup4
pip2.7 install lxml

注意: 通过编译安装的pip2.7 安装lxml会报错,因此还是建议使用yum安装的pip2.7

2.代码实现

vim csdn_login.py
#!/usr/bin/env python2.7
#-*- coding: utf-8 -*-

import urllib
import urllib2
import cookielib
from bs4 import BeautifulSoup

filename = 'cookie_csdn.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler = urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler)

loginurl = "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"

#登陆前准备:获取lt和exection
response = opener.open(loginurl)
soup = BeautifulSoup(response.read(), "lxml")
for input in soup.form.find_all("input"):
 if input.get("name") == "lt":
 lt = input.get("value")
 if input.get("name") == "execution":
 execution = input.get("value")
#post信息
values = {
 "username":"用户名",
 "password":"密码",
 "lt":lt,
 "execution":execution,
 "_eventId":"submit"
 }
postdata = urllib.urlencode(values)

opener.addheaders = [("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36")]

#模拟登录,保存cookie到cookie.txt中
result = opener.open(loginurl, postdata)

cookie.save(ignore_discard=True, ignore_expires=True)
#登陆后我们随意跳转到博客
url = "http://blog.csdn.net/XXXXXXXXX"
result = opener.open(url)

3.运行

python2.7 csdn_login.py

至此,当我们登陆后,可以随意指定一个页面进行登陆了。

总结

1.urllib和urllib2配合使用,因为urllib可以将post数据进行encode,而urllib2不可以

2.由于使用cookie、header等,用到了urllib2的基础库opener实现访问等操作,当然也可以使用urllib2.Request(url,data,header)等其他访问方式。

3.每个网站登录方式可能不一样,我们需要根据实际情况分析。

4.模拟登陆是我们通过实战学习python的一种方法,而不是用它来恶意攻击。

以上这篇python爬虫之模拟登陆csdn的实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
批处理与python代码混合编程的方法
May 19 Python
Python运算符重载详解及实例代码
Mar 07 Python
Python入门_学会创建并调用函数的方法
May 16 Python
python如何为创建大量实例节省内存
Mar 20 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
Apr 26 Python
python3.6利用pyinstall打包py为exe的操作实例
Oct 31 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
Jan 14 Python
Python3.x+pyqtgraph实现数据可视化教程
Mar 14 Python
Python字符串查找基本操作代码案例
Oct 27 Python
python 如何上传包到pypi
Dec 24 Python
如何用Python和JS实现的Web SSH工具
Feb 23 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 #Python
python自动截取需要区域,进行图像识别的方法
May 17 #Python
Python使用Phantomjs截屏网页的方法
May 17 #Python
Python 实现网页自动截图的示例讲解
May 17 #Python
Python操作Sql Server 2008数据库的方法详解
May 17 #Python
Python读写及备份oracle数据库操作示例
May 17 #Python
Python selenium抓取微博内容的示例代码
May 17 #Python
You might like
PHP中extract()函数的妙用分析
2012/07/11 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
jQuery拖拽div实现思路
2014/02/19 Javascript
javascript的函数作用域
2014/11/12 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
2016/05/10 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
[01:50:49]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第三场 1月24日
2021/03/11 DOTA
Python 错误和异常小结
2013/10/09 Python
python爬取网站数据保存使用的方法
2013/11/20 Python
python实现的文件夹清理程序分享
2014/11/22 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
基于python实现简单日历
2018/07/28 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
销售业务实习自我鉴定
2013/09/23 职场文书
成考报名单位证明范本
2014/01/16 职场文书
管理专员自荐信
2014/01/26 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
通知的写法
2015/04/23 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python