Python模拟百度登录实例详解

http://www.jb51.net/article/78406.htm

Python实战计划学习作业2-1

http://blog.csdn.net/python012/article/details/53344501

参考了以下网上获取百度网吧登陆的代码,先拿到token,然后用密码登陆得到cookie,继续拿到浏览记录

但有时可以拿到有时不行,拿到了空的list,比较了下是因为cookie少了Hm_lvt_之类的东西

也许跟切换账号需要验证码有关,然后尝试修改cookie,但这两种cookie都不好改

SimpleCookie

MozillaCookieJar

  1. # -*- coding: utf8 -*-
  2. import urllib2
  3. import urllib
  4. import cookielib
  5. import re
  6. import bs4
  7. import json
  8. import time
  9. import Cookie
  10. import random
  11. import datetime
  12. #import syslog
  13. #import requests
  14. URL_BAIDU_INDEX = u'http://www.baidu.com/';
  15. #https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true 也可以用这个
  16. URL_BAIDU_TOKEN = 'https://passport.baidu.com/v2/api/?getapi&tpl=pp&apiver=v3&class=login';
  17. URL_BAIDU_LOGIN = 'https://passport.baidu.com/v2/api/?login';
  18. SAVE_FILE = 'D:\\bduhis.txt';
  19. SAVE_JFILE = 'D:\\json.txt';
  20. SAVE_CFILE = 'D:\\cookie.txt';
  21. #设置用户名、密码
  22. username = '';
  23. password = '';
  24. #设置cookie,这里cookiejar可自动管理,无需手动指定
  25. #cj = cookielib.CookieJar();
  26. filename = 'cookie.txt'
  27. cj = cookielib.MozillaCookieJar(SAVE_CFILE);
  28.  
  29. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj));
  30. urllib2.install_opener(opener);
  31. #print cj;
  32. reqReturn = urllib2.urlopen(URL_BAIDU_INDEX);
  33. #cj.set_cookie(make_cookie('testname','testvalue' ))
  34. '''更改cookie不成功
  35. c=Cookie.SimpleCookie();
  36. c["Manageopen"]="cards";
  37. c['Manageopen']['expires'] = 0;
  38. c['Manageopen']['path'] = "/";
  39. c['Manageopen']['domain'] = ".domain.com";
  40. c['Manageopen']['secure'] = "";
  41. cj.set_cookie(c["Manageopen"]) ;
  42. '''
  43. print cj;
  44. cj.save(ignore_discard=True, ignore_expires=False)
  45.  
  46. #获取token,
  47. tokenReturn = urllib2.urlopen(URL_BAIDU_TOKEN);
  48. matchVal = re.search(u'"token" : "(?P<tokenVal>.*?)"',tokenReturn.read());
  49. tokenVal = matchVal.group('tokenVal');
  50. #构造登录请求参数,该请求数据是通过抓包获得,对应https://passport.baidu.com/v2/api/?login请求
  51.  
  52. postData = {
  53. 'username' : username,
  54. 'password' : password,
  55. 'u' : 'https://passport.baidu.com/',
  56. 'tpl' : 'pp',
  57. 'token' : tokenVal,
  58. 'staticpage' : 'https://passport.baidu.com/static/passpc-account/html/v3Jump.html',
  59. 'isPhone' : 'false',
  60. 'charset' : 'utf-8',
  61. 'callback' : 'parent.bd__pcbs__ra48vi'
  62. };
  63. postData = urllib.urlencode(postData);
  64. #发送登录请求
  65. loginRequest = urllib2.Request(URL_BAIDU_LOGIN,postData);
  66. loginRequest.add_header('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
  67. loginRequest.add_header('Accept-Encoding','gzip,deflate,sdch');
  68. loginRequest.add_header('Accept-Language','zh-CN,zh;q=0.8');
  69. loginRequest.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36');
  70. loginRequest.add_header('Content-Type','application/x-www-form-urlencoded');
  71.  
  72. sendPost = urllib2.urlopen(loginRequest);
  73. #查看贴吧个人主页 ,测试是否登陆成功,由于cookie自动管理,这里处理起来方便很多
  74. #http://tieba.baidu.com/home/main?un=XXXX&fr=index 这个是贴吧个人主页,各项信息都可以在此找到链接
  75. #teibaUrl = 'http://tieba.baidu.com/f/like/mylike?v=1387441831248'
  76. # http://i.baidu.com/my/history
  77. # http://map.baidu.com/
  78. #http://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&from=webmap&da_par=direct&pcevaname=pc3&qt=fav&mode=get&type=favdata&limit=100&lastver=0&t=1481726657277
  79. #teibaUrl = 'http://i.baidu.com/my/historylogin'
  80. teibaUrl = 'http://i.baidu.com/login/historyCheck/?autoLogin=true'
  81. content = urllib2.urlopen(teibaUrl).read();
  82. #print content;
  83. teibaUrl = 'http://i.baidu.com/history/list'
  84. content = urllib2.urlopen(teibaUrl).read();
  85. content = content.decode('utf-8').encode('GB18030');
  86. print content;
  87. teibaUrl = 'http://map.baidu.com/?qt=ssn&t=1482059818916'
  88. content2 = urllib2.urlopen(teibaUrl).read();
  89. content2 = content2.decode('utf-8').encode('GB18030');
  90. print content2;
  91. '''1. save to html file
  92. def cbk(a, b, c):
  93. #回调函数
  94. #@a: 已经下载的数据块
  95. #@b: 数据块的大小
  96. #@c: 远程文件的大小
  97. per = 100.0 * a * b / c
  98. if per > 100:
  99. per = 100
  100. print '%.2f%%' % per
  101. urllib.urlretrieve('http://www.cmfish.com/bbs/forum.php','D:\\baidu1.html',cbk);
  102. '''
  103.  
  104. def save(filename, contents):
  105. fh = open(filename, 'w')
  106. fh.write(contents)
  107. fh.close()
  108. '''2. save to txt file
  109. t = json.dumps(content, ensure_ascii=False);
  110. hjson = json.loads(content, encoding='utf-8');
  111. #t2=content.decode('utf-8');
  112. #print hjson['data']['list'][0]['query'];
  113. print hjson;
  114. arr = hjson['data']['list']
  115. tdata = 'Start----------------------------\nTime:'+time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+' Total:'+str(len(arr))+':\n';
  116. for elem in arr:
  117. data = str(elem['ts'])+','+elem['query']+','+str(len(elem['clicks']));
  118. if len(elem['clicks'])>0:
  119. try:
  120. for cd in elem['clicks']:
  121. data = data + ','+str(cd['title'])+','+str(cd['url']);
  122. except Exception,e:
  123. tdata = tdata + 'Error:'+str(e)+'\n';
  124. tdata = tdata + data+'\n';
  125. print tdata;
  126. tdata = tdata + 'End----------------------------\n';
  127. save(SAVE_FILE, tdata.encode('gbk')) ;
  128. '''
  129. hjson = json.loads(content, encoding='utf-8');
  130. save(SAVE_JFILE, content.encode('utf-8')) ;
  131. # 3. save to mongodb
  132. from pymongo import MongoClient
  133. client = MongoClient('127.0.0.1', 27017)
  134. db = client["Collections"]#数据库名
  135. table=db['his']#表名
  136. table.save(hjson)
  137. hjson2 = json.loads(content2, encoding='utf-8');
  138. table.save(hjson2)
  139. #table.insert({'id':'1','name':'cnki'})
  140.  
  141. '''
  142. #解析数据,用的BeautifulSoup4,感觉没有jsoup用的爽
  143. soup = bs4.BeautifulSoup(content);
  144. #print soup.prettify();
  145. list = soup.findAll('a',attrs={"href":re.compile(r"^http:")});
  146. #list = soup.findAll(name='a',attrs={'href':re.compile(r"kw="),'title':re.compile(r".")}) ;
  147. list = list[1:len(list)];
  148. careTeibalist = [];
  149. print '贴吧链接\\t吧名\\t等级';
  150. print len(list);
  151. for elem in list:
  152. soup1 = bs4.BeautifulSoup(str(elem));
  153. print 'http://tieba.baidu.com/'+elem['href']+'\\'+elem['title'];
  154. '''

然后才发现requests模块可以很方便设置header,只要自己在浏览器登陆 下获取cookie就可以得到正确的list

将得到的json保存在mongodb里面

  1. # -*- coding: utf8 -*-
  2. import urllib2
  3. import urllib
  4. import cookielib
  5. import re
  6. import bs4
  7. import json
  8. import time
  9. import Cookie
  10. import random
  11. import datetime
  12. import requests
  13. #import syslog
  14. #import requests
  15.  
  16. url = 'http://i.baidu.com/history/list'
  17. paras = {'channel':'201,202,300,301,302,303,400,100,500,501,505','ts':1475402100,'after':0,'page':25,'query':''}
  18. headers = {
  19.     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) ' +
  20.                   'Chrome/54.0.2840.87 Safari/537.3',
  21.  
  22. 'Cookie': '...'
  23. }
  24.  
  25. #data=requests.get(url, headers=headers);
  26. data=requests.post(url, data=paras,headers=headers);
  27. content=data.text;
  28. print content;
  29.  
  30. #hjson = json.loads(content, encoding='utf-8');
  31. #save(SAVE_JFILE, content.encode('utf-8')) ;
  32. # 3. save to mongodb
  33. from pymongo import MongoClient
  34. client = MongoClient('127.0.0.1', 27017)
  35. db = client["Collections"]#数据库名
  36. table=db['history']#表名
  37. hjson = json.loads(content, encoding='utf-8');
  38. arr = hjson['data']['list']
  39. print len(arr)
  40. table.save(hjson)
  41. cnt = 0
  42. #table.insert({'id':'1','name':'cnki'})
  43.  
  44. while (len(arr) >0):
  45. cnt = cnt + len(arr)
  46. tdate = hjson['data']['ts_start']
  47. table.save(hjson)
  48. paras = {'channel':'201,202,300,301,302,303,400,100,500,501,505','ts':tdate,'after':0,'page':25,'query':''}
  49. data=requests.post(url, data=paras,headers=headers);
  50. content=data.text;
  51. print content.encode('gbk');
  52. hjson = json.loads(content, encoding='utf-8');
  53. arr = hjson['data']['list']
  54.  
  55. print tdate
  56. print cnt
  57. table=db['ts']#表名
  58. table.insert({'name':'test','time':time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),'ts_start':tdate})

Python获取百度浏览记录的更多相关文章

  1. 用 Python 获取百度搜索结果链接

    前言 近期有许多项目需要这个功能,由于Python实现起来比较简单就这么做了,代码贴下来觉得好点个赞吧~ 代码 # coding: utf-8 import os import time import ...

  2. 【Python学习笔记六】获取百度搜索结果以及百度返回“百度安全验证”问题解决

    1.获取百度搜索结果页面主要是修改百度搜索url中的参数实现,例如查询的关键字为wd: 举例:https://www.baidu.com/s?wd=python",这样就可以查询到‘pyth ...

  3. Django之使用redis缓存session,历史浏览记录,首页数据实现性能优化

    Redis缓存session 配置Django缓存数据到redis中 # diango的缓存配置 CACHES = { "default": { "BACKEND&quo ...

  4. [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

    前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(I ...

  5. 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期

    腾讯云图片鉴黄集成到C#   官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...

  6. 清空网站浏览记录就行啦?看Python如何实时监控网站浏览记录

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 需求: (1) 获取你对象chrome前一天的浏览记录中的所有网址(url ...

  7. python爬虫获取百度图片(没有精华,只为娱乐)

    python3.7,爬虫技术,获取百度图片资源,msg为查询内容,cnt为查询的页数,大家快点来爬起来.注:现在只能爬取到百度的小图片,以后有大图片的方法,我会陆续发贴. #!/usr/bin/env ...

  8. shell,python获取当前路径(脚本的当前路径) (aso项目记录)

    一.shell获取脚本当前路径 cur_dir=$(cd "$(dirname "$0")"; pwd)  #获取当前脚本的绝对路径,参数$0是当前脚本对象 等 ...

  9. js记录用户在网站的浏览记录和停留时间

    by weber开发者 from http://weber.pub/ 本文地址: http://weber.pub/js记录用户行为浏览记录和停留时间/163.html 问题 公司想统计一个用户从进入 ...

随机推荐

  1. Python——继承

    Python的继承是多继承机制,一个子类可以同时有多个直接父类:继承可以得到父类定义的方法,子类就可以复用父类的方法. 一.继承的语法 子类:实现继承的类. 父类(基类.超类):被继承的类. 子类继承 ...

  2. mdk编译时的内存分析

    内存四区(代码区,全局区,栈区,堆区) Code:即代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区. RO-data:Read Only data,即只读数据域,它指程序中用到的只读数 ...

  3. oracle 生成随机日期+时间

    oracle 生成随机日期+时间 SELECT to_date(TRUNC(DBMS_RANDOM.VALUE(to_number(to_char(to_date('20110101','yyyymm ...

  4. 2019牛客多校九 I. KM and M (类欧几里得)

    大意: 给定$N,M$, 求$\sum\limits_{K=1}^N \text{(KM)&M}$ 考虑第$i$位的贡献, 显然为$\lfloor\frac{KM}{2^i}\rfloor$为 ...

  5. linux安装imagemagick,centos安装imagemagick方法

    1.安装文件格式支持库 yum install tcl-devel libpng-devel libjpeg-devel ghostscript-devel bzip2-devel freetype- ...

  6. 解决SVN蓝色问号的问题

    桌面或文件夹右键,选择TortoiseSVN->Settings打开设置对话框,选择Icon Overlays->Overlay Handlers->取消钩选Unversioned. ...

  7. js 遍历树的层级关系的实现

    1.遍历树的层级关系 1)先整理数据 2)找到id和数据的映射关系 3)然后找到父节点的数据,进行存储 test() { const list = [ { id: ", parentId: ...

  8. span标签中显示固定长度,超出部分用省略号代替,光标放到文字上显示全部

    在span中实现显示某段内容,固定其长度,多余部分用省略号代替,这样就用到html的title属性: 如:<span title="value"></span&g ...

  9. centos+docker+jenkins

    1.直接运行jenkins镜像,无该镜像会直接下载 docker run -p 8080:8080 -p 50000:50000 -d -v /home/jenkins-home-docker:/va ...

  10. CSS3或CSS+JS实现改变滚动条样式(兼容所有浏览器)

    /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 16px; /*滚动条宽度*/ height: 16px; /*滚动条高度*/ } ...