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的ORM框架SQLAlchemy入门教程
Apr 28 Python
教你用python3根据关键词爬取百度百科的内容
Aug 18 Python
python虚拟环境virtualenv的安装与使用
Sep 21 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
Apr 21 Python
Python3中关于cookie的创建与保存
Oct 21 Python
老生常谈python中的重载
Nov 11 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
Opencv实现抠图背景图替换功能
May 21 Python
python获得命令行输入的参数的两种方式
Nov 02 Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 Python
教你用Python写一个植物大战僵尸小游戏
Apr 25 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中JSON的使用方法
2015/04/30 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
PHP中上传文件打印错误错误类型分析
2019/04/14 PHP
JavaScript中的类继承
2010/11/25 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
python基础教程之udp端口扫描
2014/02/10 Python
Python Tkinter简单布局实例教程
2014/09/03 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
python 换位密码算法的实例详解
2017/07/19 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
python程序控制NAO机器人行走
2019/04/29 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
python命令行参数用法实例分析
2019/06/25 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
中国医药集团国药在线:国药网
2017/02/06 全球购物
这段代码难道不该打印出56吗
2013/02/27 面试题
转党组织关系介绍信
2014/01/08 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
小学毕业典礼演讲稿
2014/09/09 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
一个都不能少观后感
2015/06/04 职场文书
2019年教师入党申请书
2019/06/27 职场文书
基于Python实现nc批量转tif格式
2022/08/14 Python