Python3.X登录模拟CSDN,获取文章列表
2015-06-06 10:51
721 查看
目录:
本文主要讲用Python模拟CSDN的登录并获取自己文章的列表
推荐的两篇文章
Python模拟登录CSDN
获取需要post的参数
抓取http请求
分析post请求得到参数
找到生成post参数的请求和生成方法
代码实现
总结
以模拟登录CSDN为例,走一下获取参数的过程
讲解如何在登录时候获取需要post的参数
找到生成post参数的URL,和生成方法
代码实现
分析post请求,得到参数
![](http://img.blog.csdn.net/20150606171340922)
![](http://img.blog.csdn.net/20150606171941010)
画红线的是我们需要post的参数(‘username’ ‘password’ ‘lt’ ‘execuyion’ ‘_eventId’),绿线的是我们请求的URL,注意绿线的URL里有个 ‘jsessionid’,这个可能也是动态生成的,所以在找生成参数的URL时候把它也带上。知道post哪些参数了,就需要确定这些参数是不是动态生成的(应该大一点的网站都是动态生成的),确定是不是动态生成的办法是,把cookie清除,然后再重新登录,抓取一下,看看这些参数是不是一样。若是动态生成,就要确定这个post之前的哪些请求生成了这些参数的值。
一种是看之前的请求,感觉哪些请求可能是,有选择的看
上面的’lt’我一开始搜索了,得到很多的结果,好多都是没用的,后来用第二种方法找之前抓到的请求,在https://passport.csdn.net/account/login 这个请求返回的html里发现了参数,看下图
![](http://img.blog.csdn.net/20150606182850859)
可以看到上面的参数都在这里,可以用个正则表达式把这个参数的值匹配出来。多访问几次这个网址,就可以发现每次返回的参数不一样。前面说到还有一个’jsessionid’,这个参数也在这个html里,它是在上面
![](http://img.blog.csdn.net/20150606183427445)
参数找完了直接实现就可以了,这里没说参数生成的方法,CSDN登录生成的参数在服务器端,它把直接生成好的值给你发过来。而新浪微博的登录(第一篇文章)就有一个参数需要经过加密在本地生成,这样的话就得去分析前面的JavaScript,获得生成的方法。
本文主要讲用Python模拟CSDN的登录并获取自己文章的列表
推荐的两篇文章
Python模拟登录CSDN
获取需要post的参数
抓取http请求
分析post请求得到参数
找到生成post参数的请求和生成方法
代码实现
总结
本文主要讲用Python模拟CSDN的登录,并获取自己文章的列表
推荐两篇文章,一篇是模拟新浪微博的登录,一篇是讲解如何在登录时获取需要post的参数(有的网站登录可能用的是get,以前有,现在应该很少很少了)以模拟登录CSDN为例,走一下获取参数的过程
推荐的两篇文章:
模拟新浪微博登录讲解如何在登录时候获取需要post的参数
Python模拟登录CSDN:
获取需要post的参数,和post的URL找到生成post参数的URL,和生成方法
代码实现
获取需要post的参数
准备好工具,抓取各种http请求分析post请求,得到参数
抓取http请求
读了第二篇文章应该对抓取各种请求有一定了解了,下面这个图是用IE11抓取到的分析post请求得到参数
注意那个post请求,这个请求是我们在登录界面输入完用户名、密码后浏览器向服务器做的请求,这个请求里就有我们需要post的参数,双击这个请求看看详细信息,点开‘请求正文’就是我们需要获得的参数画红线的是我们需要post的参数(‘username’ ‘password’ ‘lt’ ‘execuyion’ ‘_eventId’),绿线的是我们请求的URL,注意绿线的URL里有个 ‘jsessionid’,这个可能也是动态生成的,所以在找生成参数的URL时候把它也带上。知道post哪些参数了,就需要确定这些参数是不是动态生成的(应该大一点的网站都是动态生成的),确定是不是动态生成的办法是,把cookie清除,然后再重新登录,抓取一下,看看这些参数是不是一样。若是动态生成,就要确定这个post之前的哪些请求生成了这些参数的值。
找到生成post参数的请求和生成方法
一种方法是直接搜索参数,可以看到上图中有个查找功能,把需要查找的参数放里,往前查找,这种查找有个缺点,很短的参数,会查到很多选项,比如上面的参数’lt’一种是看之前的请求,感觉哪些请求可能是,有选择的看
上面的’lt’我一开始搜索了,得到很多的结果,好多都是没用的,后来用第二种方法找之前抓到的请求,在https://passport.csdn.net/account/login 这个请求返回的html里发现了参数,看下图
可以看到上面的参数都在这里,可以用个正则表达式把这个参数的值匹配出来。多访问几次这个网址,就可以发现每次返回的参数不一样。前面说到还有一个’jsessionid’,这个参数也在这个html里,它是在上面
参数找完了直接实现就可以了,这里没说参数生成的方法,CSDN登录生成的参数在服务器端,它把直接生成好的值给你发过来。而新浪微博的登录(第一篇文章)就有一个参数需要经过加密在本地生成,这样的话就得去分析前面的JavaScript,获得生成的方法。
代码实现
# 以下4行代码说简单点就是让你接下来的所有get和post请求都带上已经获取的cookie,因为稍大些的网站的登陆验证全靠cookie cj = http.cookiejar.LWPCookieJar() cookie_support = urllib.request.HTTPCookieProcessor(cj) opener = urllib.request.build_opener(cookie_support , urllib.request.HTTPHandler) urllib.request.install_opener(opener) def crawl_CSDN(user_name,password): para_url="https://passport.csdn.net/account/login" post_url="https://passport.csdn.net/account/login" user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = { 'User-Agent' : user_agent ,'Host': 'passport.csdn.net'} request=urllib.request.Request(url=para_url,headers=headers) response=urllib.request.urlopen(request) # 获取包含参数的html data=response.read().decode(errors='ignore') # 获取参数 jsessionid=re.findall('jsessionid=(.*)\"', data, flags=0)[0] lt=re.findall('name="lt" value=\"(.*)\"', data, flags=0)[0] execution=re.findall('name="execution" value=\"(.*)\"', data, flags=0)[0] # 需要提交的参数 parameters={'username':user_name,'password':password,'lt':lt,'execution':execution,'_eventId':'submit'} # 把参数变为指定格式 post_data=urllib.parse.urlencode(parameters).encode(encoding='utf_8', errors='strict') post_url=post_url+';'+jsessionid post_request=urllib.request.Request(post_url,post_data,headers) post_response=urllib.request.urlopen(post_request) print(post_response.read().decode(errors='ignore')) #=========================================================================== # print(execution) # print(lt) # print(jsessionid) # print(data) #=========================================================================== print(get('http://write.blog.csdn.net/postlist')) # print(get('http://www.csdn.net')) def get(url): user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = { 'User-Agent' : user_agent} request=urllib.request.Request(url=url,headers=headers) response=urllib.request.urlopen(request) # 获取包含参数的html data=response.read().decode(errors='ignore') return data ps.代码丑陋,勿怪! 这里并没有把文章的列表匹配出来,只是返回了相应的html,写个正则就OK了。
总结
不写个总结,目录那里底下总感觉缺点啥。模拟登录一个网站一定要知道浏览器和服务器打交道的过程,这样不至于云里雾里,不知道什么地方是重点(尤其对于非计算机专业还没学过计算机网络的学生)。可以学学html,知道一些标签都是干嘛的。学学网络编程,了解下服务器和客户端互相通信的过程。相关文章推荐
- 用python实现排列
- python函数内嵌,嵌套函数
- Python使用mechanize模拟浏览器
- 黄聪:Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
- Python标准库:内置函数tuple([iterable])
- Python标准库:内置函数tuple([iterable])
- python操作Sqlite3详细整理
- Python Generator初探(二)
- 转:python安装pycrypto
- Python生成随机数的方法
- Python中的Lambda表达式小析
- Python多级排序(多属性排序)csv文件
- python 面相对象
- python paramiko sftp
- python paramiko ssh
- python diango 新建blog
- python django框架 安装
- python 多线程threading
- python 多进程multiprocessing
- DataFrame与shp文件相互转换