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

来源:互联网 发布:十月革命 知乎 编辑:程序博客网 时间:2024/04/28 04:30

目录:

    • 本文主要讲用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的参数,双击这个请求看看详细信息,点开‘请求正文’就是我们需要获得的参数
post参数
画红线的是我们需要post的参数(‘username’ ‘password’ ‘lt’ ‘execuyion’ ‘_eventId’),绿线的是我们请求的URL,注意绿线的URL里有个 ‘jsessionid’,这个可能也是动态生成的,所以在找生成参数的URL时候把它也带上。知道post哪些参数了,就需要确定这些参数是不是动态生成的(应该大一点的网站都是动态生成的),确定是不是动态生成的办法是,把cookie清除,然后再重新登录,抓取一下,看看这些参数是不是一样。若是动态生成,就要确定这个post之前的哪些请求生成了这些参数的值。

找到生成post参数的请求和生成方法

  • 一种方法是直接搜索参数,可以看到上图中有个查找功能,把需要查找的参数放里,往前查找,这种查找有个缺点,很短的参数,会查到很多选项,比如上面的参数’lt’
  • 一种是看之前的请求,感觉哪些请求可能是,有选择的看
    上面的’lt’我一开始搜索了,得到很多的结果,好多都是没用的,后来用第二种方法找之前抓到的请求,在https://passport.csdn.net/account/login 这个请求返回的html里发现了参数,看下图
    获取到的post参数值
    可以看到上面的参数都在这里,可以用个正则表达式把这个参数的值匹配出来。多访问几次这个网址,就可以发现每次返回的参数不一样。前面说到还有一个’jsessionid’,这个参数也在这个html里,它是在上面
    jsessid
    参数找完了直接实现就可以了,这里没说参数生成的方法,CSDN登录生成的参数在服务器端,它把直接生成好的值给你发过来。而新浪微博的登录(第一篇文章)就有一个参数需要经过加密在本地生成,这样的话就得去分析前面的JavaScript,获得生成的方法。

代码实现

# 以下4行代码说简单点就是让你接下来的所有get和post请求都带上已经获取的cookie,因为稍大些的网站的登陆验证全靠cookiecj = 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 dataps.代码丑陋,勿怪! 这里并没有把文章的列表匹配出来,只是返回了相应的html,写个正则就OK了。

总结

不写个总结,目录那里底下总感觉缺点啥。模拟登录一个网站一定要知道浏览器和服务器打交道的过程,这样不至于云里雾里,不知道什么地方是重点(尤其对于非计算机专业还没学过计算机网络的学生)。可以学学html,知道一些标签都是干嘛的。学学网络编程,了解下服务器和客户端互相通信的过程。

0 0
原创粉丝点击