您的位置:首页 > 编程语言 > Python开发

Python3.X登录模拟CSDN,获取文章列表

2015-06-06 10:51 721 查看
目录:

本文主要讲用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,知道一些标签都是干嘛的。学学网络编程,了解下服务器和客户端互相通信的过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: