python实现登陆知乎获得个人收藏并保存为word文件

时间:2022-02-24 19:57:05

这个程序其实很早之前就完成了,一直没有发出了,趁着最近不是很忙就分享给大家.

使用BeautifulSoup模块和urllib2模块实现,然后保存成word是使用python docx模块的,安装方式网上一搜一大堆,我就不再赘述了.

主要实现的功能是登陆知乎,然后将个人收藏的问题和答案获取到之后保存为word文档,以便没有网络的时候可以查阅.当然,答案中如果有图片的话也是可以获取到的.不过这块还是有点问题的.等以后有时间了在修改修改吧.

还有就是正则,用的简直不要太烂…鄙视下自己…

还有,现在是问题的话所有的答案都会保存下来的.看看有时间修改成只保存第一个答案或者收藏页问题的答案吧.要不然如果收藏的太多了的话保存下来的word会吓你一跳的哦.O(∩_∩)O哈哈~

在登陆的时候可能会需要验证码,如果提示输入验证码的话在程序的文件夹下面就可以看到验证码的图片,照着输入就ok了.

  1. # -*- coding: utf-8 -*- 
  2. #登陆知乎抓取个人收藏 然后保存为word 
  3. import sys 
  4. reload(sys)  
  5. sys.setdefaultencoding('utf-8'
  6. import urllib 
  7. import urllib2 
  8. import cookielib 
  9. import string 
  10. import re 
  11. from bs4 import BeautifulSoup 
  12. from docx import Document 
  13. from docx import * 
  14. from docx.shared import Inches 
  15. from sys import exit 
  16. import os 
  17.    
  18. #这儿是因为在公司上网的话需要使用socket代理 
  19. #import socks 
  20. #import socket 
  21. #socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"127.0.0.1",8088) 
  22. #socket.socket =socks.socksocket 
  23.    
  24. loginurl='http://www.zhihu.com/login' 
  25.    
  26. headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36',}  
  27.    
  28. postdata={ 
  29.  '_xsrf''acab9d276ea217226d9cc94a84a231f7'
  30.  'email'''
  31.  'password'''
  32.  'rememberme':'y'  
  33.    
  34. if not os.path.exists('myimg'): 
  35.   os.mkdir('myimg'
  36. if os.path.exists('123.docx'): 
  37.   os.remove('123.docx'
  38. if os.path.exists('checkcode.gif'): 
  39.   os.remove('checkcode.gif'
  40.    
  41. mydoc=Document() 
  42. questiontitle='' 
  43. #---------------------------------------------------------------------- 
  44. def dealimg(imgcontent): 
  45.   soup=BeautifulSoup(imgcontent) 
  46.   try
  47.     for imglink in soup.findAll('img'): 
  48.       if imglink is not None : 
  49.         myimg= imglink.get('src'
  50.         #print myimg 
  51.         if myimg.find('http')>=0: 
  52.           imgsrc=urllib2.urlopen(myimg).read() 
  53.           imgnamere=re.compile(r'http\S*/'
  54.           imgname=imgnamere.sub('',myimg) 
  55.           #print imgname 
  56.           with open(u'myimg'+'/'+imgname,'wb') as code: 
  57.             code.write(imgsrc) 
  58.             mydoc.add_picture(u'myimg/'+imgname,width=Inches(1.25)) 
  59.   except: 
  60.     pass 
  61.   strinfo=re.compile(r'<noscript>[\s\S]*</noscript>'
  62.   imgcontent=strinfo.sub('',imgcontent) 
  63.   strinfo=re.compile(r'<img class[\s\S]*</>'
  64.   imgcontent=strinfo.sub('',imgcontent) 
  65.   #show all 
  66.   strinfo=re.compile(r'<a class="toggle-expand[\s\S]*</a>'
  67.   imgcontent=strinfo.sub('',imgcontent) 
  68.    
  69.   strinfo=re.compile(r'<a class=" wrap external"[\s\S]*rel="nofollow noreferrer" target="_blank">'
  70.   imgcontent=strinfo.sub('',imgcontent) 
  71.   imgcontent=imgcontent.replace('<i class="icon-external"></i></a>',''
  72.    
  73.    
  74.   imgcontent=imgcontent.replace('</b>','').replace('</p>','').replace('<p>','').replace('<p>','').replace('<br>',''
  75.   return imgcontent 
  76.      
  77.    
  78.    
  79.    
  80.    
  81. def enterquestionpage(pageurl): 
  82.   html=urllib2.urlopen(pageurl).read() 
  83.   soup=BeautifulSoup(html) 
  84.   questiontitle=soup.title.string 
  85.   mydoc.add_heading(questiontitle,level=3) 
  86.   for div in soup.findAll('div',{'class':'fixed-summary zm-editable-content clearfix'}): 
  87.     #print div 
  88.     conent=str(div).replace('<div class="fixed-summary zm-editable-content clearfix">','').replace('</div>',''
  89.        
  90.     conent=conent.decode('utf-8'
  91.     conent=conent.replace('<br/>','\n'
  92.        
  93.     conent=dealimg(conent) 
  94.     ###这一块弄得太复杂了 有时间找找看有没有处理html的模块 
  95.     conent=conent.replace('<div class="fixed-summary-mask">','').replace('<blockquote>','').replace('<b>','').replace('<strong>','').replace('</strong>','').replace('<em>','').replace('</em>','').replace('</blockquote>',''
  96.     mydoc.add_paragraph(conent,style='BodyText3'
  97.     """file=open('222.txt','a'
  98.     file.write(str(conent)) 
  99.     file.close()""
  100.        
  101.    
  102. def entercollectpage(pageurl): 
  103.   html=urllib2.urlopen(pageurl).read() 
  104.   soup=BeautifulSoup(html) 
  105.   for div in soup.findAll('div',{'class':'zm-item'}): 
  106.     h2content=div.find('h2',{'class':'zm-item-title'}) 
  107.     #print h2content 
  108.     if h2content is not None: 
  109.       link=h2content.find('a'
  110.       mylink=link.get('href'
  111.       quectionlink='http://www.zhihu.com'+mylink 
  112.       enterquestionpage(quectionlink) 
  113.       print quectionlink     
  114.    
  115.    
  116.    
  117. def loginzhihu(): 
  118.   postdatastr=urllib.urlencode(postdata) 
  119.   ''
  120.   cj = cookielib.LWPCookieJar() 
  121.   cookie_support = urllib2.HTTPCookieProcessor(cj) 
  122.   opener = urllib2.build_opener(cookie_support,urllib2.HTTPHandler) 
  123.   urllib2.install_opener(opener) 
  124.   ''
  125.   h = urllib2.urlopen(loginurl) 
  126.   request = urllib2.Request(loginurl,postdatastr,headers) 
  127.   request.get_origin_req_host 
  128.   response = urllib2.urlopen(request) 
  129.   #print response.geturl() 
  130.   text = response.read() 
  131.    
  132.    
  133.   collecturl='http://www.zhihu.com/collections' 
  134.   req=urllib2.urlopen(collecturl) 
  135.   if str(req.geturl())=='http://www.zhihu.com/?next=%2Fcollections'
  136.     print 'login fail!' 
  137.     return 
  138.   txt=req.read() 
  139.    
  140.   soup=BeautifulSoup(txt) 
  141.   count=0 
  142.   divs =soup.findAll('div',{'class':'zm-item'}) 
  143.   if divs is None: 
  144.     print 'login fail!' 
  145.     return 
  146.   print 'login ok!\n' 
  147.   for div in divs: 
  148.        
  149.     link=div.find('a'
  150.     mylink=link.get('href'
  151.     collectlink='http://www.zhihu.com'+mylink 
  152.     entercollectpage(collectlink) 
  153.     print collectlink 
  154.     #这儿是当时做测试用的,值获取一个收藏 
  155.     #count+=1 
  156.     #if count==1: 
  157.     #  return 
  158.        
  159.    
  160. def getcheckcode(thehtml): 
  161.   soup=BeautifulSoup(thehtml) 
  162.   div=soup.find('div',{'class':'js-captcha captcha-wrap'}) 
  163.   if div is not None: 
  164.     #print div 
  165.     imgsrc=div.find('img'
  166.     imglink=imgsrc.get('src'
  167.     if imglink is not None: 
  168.       imglink='http://www.zhihu.com'+imglink 
  169.    
  170.       imgcontent=urllib2.urlopen(imglink).read() 
  171.       with open('checkcode.gif','wb') as code: 
  172.         code.write(imgcontent) 
  173.       return True 
  174.     else
  175.       return False 
  176.   return False 
  177.    
  178.    
  179. if __name__=='__main__'
  180.      
  181.   import getpass 
  182.   username=raw_input('input username:'
  183.   password=getpass.getpass('Enter password: ')  
  184.      
  185.   postdata['email']=username 
  186.   postdata['password']=password 
  187.   postdatastr=urllib.urlencode(postdata) 
  188.   cj = cookielib.LWPCookieJar() 
  189.   cookie_support = urllib2.HTTPCookieProcessor(cj) 
  190.   opener = urllib2.build_opener(cookie_support,urllib2.HTTPHandler) 
  191.   urllib2.install_opener(opener) 
  192.    
  193.   h = urllib2.urlopen(loginurl) 
  194.   request = urllib2.Request(loginurl,postdatastr,headers) 
  195.   response = urllib2.urlopen(request) 
  196.   txt = response.read() 
  197.    
  198.   if getcheckcode(txt): 
  199.     checkcode=raw_input('input checkcode:'
  200.     postdata['captcha']=checkcode 
  201.     loginzhihu() 
  202.     mydoc.save('123.docx'
  203.   else
  204.     loginzhihu() 
  205.     mydoc.save('123.docx'
  206.    
  207.   print 'the end' 
  208.   raw_input() 

好了,大概就是这样,大家如果有什么好的建议或者什么的可以再下面留言,我会尽快回复的.或者在小站的关于页面有我的联系方式,直接联系我就ok.