设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 16210|回复: 7
打印 上一主题 下一主题

python个人学习笔记

[复制链接]

1

主题

0

好友

98

积分

注册会员

Rank: 2

跳转到指定楼层
楼主
发表于 2014-3-24 11:22:19 |只看该作者 |倒序浏览
本帖最后由 508490571 于 2014-4-5 19:39 编辑

楼主0技术基础,软件只会txt。学python主为兴趣爬虫。开此贴为学习笔记整理,所有操作基于windows,望大大们多多指导.在我个人博客www.zhuyuntong.com也有发表
首先,感谢Crossin先生,先生从最基本的如何cd 开始孜孜不倦,给了我很大帮助,要不我估计都坚持不到现在,开此学习贴的想法也是得助于先生的建议。
最后用从先生那里学习到的两句话开始这个帖子吧,一是“功不唐捐”;二是“talk is cheap, show me the code” 共勉~

学习阶段一(update:2014-3-24):
实现功能:读取豆瓣电影爱情标签中的电影名字,电影别名,评分,评价人数,并保存到本地txt中
代码如下:
  1. # -*- coding: cp936 -*-
  2. import urllib2
  3. import re
  4. text=urllib2.urlopen('http://movie.douban.com/tag/%E7%88%B1%E6%83%85').read()#打开爱情标签
  5. text1=re.findall(
  6.     r'''"">
  7.                         .*?
  8.                         / <span style="font-size:12px;">.*?</s|"rating_nums">.*?</span>|"pl">.*?</span>''',text)#正则查找出相对应字符串,list形式
  9. text2=''.join(text1)#list无法直接replace,需先转为str模式
  10. text3=text2.replace(
  11.     '<span style="font-size:12px;">','').replace(
  12.         '</s"rating_nums">','').replace(
  13.             '</span>"pl">','').replace(
  14.             '</span>"">','').replace(
  15.                 '</span>','').replace(
  16.                     '"">','').replace(
  17.                        '\n                        /',':').replace('                        ','')#把多余字符替换掉
  18. w=file('raw_douban_movie.txt','w')
  19. print text3
  20. w.write(text3)
  21. w.close()
复制代码
运行结果如下:
学习阶段二运行结果
学习总结:1、最开始没有用 join转化为str 直接replace,收到报错数据类型后,直接强行str(text1),结果无法replace只能执行首行。
2、replace用的不忍直视,无奈,只会这一招。先生说先实现功能,再想后期优化 :)
原因解析:findall执行的结果是list,replace执行于str类型,得用join转化。


学习阶段二(update:2014-3-25):
实现功能:代码中加入for循环,批量抓取全部tag,存放到本地txt
代码如下:
  1. # -*- coding: cp936 -*-
  2. import urllib2
  3. import re
  4. raw_text=urllib2.urlopen('http://movie.douban.com/tag/?view=type').read()
  5. text0=re.findall('"./.*?"',raw_text)#初步抓取tag,findall输出为list
  6. text1=''.join(text0)#list转str,方便replace
  7. text2=text1.replace('"./','').replace('"','\n')#tag提取完成
  8. text3=[]#新建空list,方便后面append
  9. for text4 in text2.split('\n'):#for in对象需为list,用split将str转为list
  10.     tagurl='http://movie.douban.com/tag/%s'%text4#讲URL前缀同tag拼接,方便后期多tag抓取
  11.     text3.append(tagurl)#循环赋值到空列表

  12. text5='\n'.join(text3)#排版格式,\n换行符
  13. e=file('douban_movie6.txt','w')
  14. e.write(text5)
  15. e.close()
复制代码
运行结果:
学习阶段一运行结果
学习总结:1、多用print,不仅可以帮助自己更好的排查错误,也可以更好的理解程序的运行逻辑。
2、多用print type()。现阶段对每种函数生成结果的存储类型还不熟悉,根据想当然的思路写通常会报错,都是数据类型不支持。
3、初步明白for in的用法,对% 用法进一步了解
4、list.append() 进一步了解。接触一种函数不仅要明白怎么用,还得留意函数输出后的数据类型

学习阶段三(update:2014-3-25):
实现功能:抓取所有tag的第一页电影的链接,名字,别名,评分,评价人数。保存到本地txt
代码如下:
  1. # -*- coding: cp936 -*-
  2. import urllib2
  3. import re
  4. import time
  5. starttime=time.time()
  6. raw_text=urllib2.urlopen('http://movie.douban.com/tag/?view=type').read()
  7. text0=re.findall('"./.*?"',raw_text)#初步抓取tag,findall输出为list
  8. text1=''.join(text0)#list转str,方便replace
  9. text2=text1.replace('"./','').replace('"','\n')#tag提取完成
  10. text3=[]#新建空list,方便后面append
  11. for text4 in text2.split('\n'):#for in对象需为list,用split将str转为list
  12.     tagurl='http://movie.douban.com/tag/%s'%text4#讲URL前缀同tag拼接,方便后期多tag抓取
  13.     text3.append(tagurl)#循环赋值到空列表
  14. del text3[-1]#最后一行为空tag,不知道生成原因。手动删除。
  15. text8=[]#新建空list,存储for执行结果
  16. for text5 in text3:
  17.     raw_tagurl=urllib2.urlopen(text5).read()#打开所有tag页面
  18.     tagurl_text=re.findall('''http://movie.douban.com/subject/\d{1,}/"  class="">
  19.                         .*?
  20.                         / <span style="font-size:12px;">.*?</span>|<span class="rating_nums">.*?</span>

  21.                            
  22.                             <span class="pl">.*?</span>''',raw_tagurl)#初步提取电影信息
  23.     text6=''.join(tagurl_text)
  24.     text7=text6.replace('''</span>

  25.                            
  26.                             <span class="pl">''','\t').replace('''"  class="">
  27.                         ''','\t').replace('</span>','\n').replace('''
  28.                         / <span style="font-size:12px;">''','\t/').replace('\n<span class="rating_nums">','\t')#剔除不需要的信息
  29.     text8.append(text7)#将for结果赋值到空list
  30.     text9=''.join(text8)#转str  write要求
  31. e=file('douban_movie7.txt','w')
  32. e.write(text9)
  33. endtime=time.time()
  34. print '用时%ss'%(starttime-endtime)
  35. e.close()
复制代码
运行结果:
学习阶段三运行结果
用时-75.5190000534s
学习总结:1、初步接触time,从@jxgx072037的豆瓣代码中看到就拿来用了。2、代码还是很初级,只能抓取所有标签的第一页,用时75s,耗时应该有点长。
还需实现的功能:抓取每个标签下的多页电影信息,去重,排序。

学习阶段四(update:2014-3-26):
实现功能:整理单个tag下的所有页面链接
代码如下:
  1. # -*- coding: cp936 -*-
  2. import urllib2
  3. import re
  4. raw_text=urllib2.urlopen('http://movie.douban.com/tag/cult').read()#指定打开cult标签页
  5. text0=re.findall('page="\d{1,}"',raw_text)#初步提取总页面数,人工查看代码后发现page="\d{1,}表示总页面
  6. text1=''.join(text0)
  7. text2=text1.replace('page=','').replace('"','')#得出总页面的具体值
  8. text5=[]
  9. for text3 in range(int(text2)):#range生成页面数列表,循环读取
  10.     text4='http://movie.douban.com/tag/cult?start=%d&type=T'%(text3*20)+'\n'#人工发现url规律为页面数*20, 最后\n为排版需要
  11.     text5.append(text4)
  12. text6=''.join(text5)
  13. e=file('douban_movie8.txt','w')
  14. e.write(text6)
  15. e.close()
复制代码
运行结果:
学习阶段四运行结果
学习总结:range(int(text2))和%(text3*20)可减少代码行数



PS:本想再继续添加,字数限制,后期学习笔记就放到回复里了

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2014-3-24 11:32:32 |只看该作者
来支持一下。期待不断更新
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

98

积分

注册会员

Rank: 2

板凳
发表于 2014-3-28 01:10:45 |只看该作者
学习阶段五(update:2013-3-28 0:38):
实现功能:为减少工作量,仅抓取所有tag页下前3页电影信息,不足3页,则全部抓取。
代码如下:
  1. # -*- coding: cp936 -*-
  2. import urllib2
  3. import re
  4. import time
  5. starttime=time.time()
  6. raw_text=urllib2.urlopen('http://movie.douban.com/tag/?view=type').read()
  7. text0=re.findall('"./.*?"',raw_text)#初步抓取tag,findall输出为list
  8. text1=''.join(text0)#list转str,方便replace
  9. text2=text1.replace('"./','').replace('"','\n')#tag提取完成
  10. a=file('douban_movie9.txt','w')
  11. a.write(text2)#分阶段保存,方便分阶段排除问题
  12. text3=[]
  13. a=file('douban_movie9.txt','r')
  14. for text4 in text2.split('\n'):
  15.     tagurl=urllib2.urlopen('http://movie.douban.com/tag/%s'%text4).read()
  16.     raw_tagurl_page=re.findall('page="\d{1,}"',tagurl)
  17.     tagurl_=''.join(raw_tagurl_page)
  18.     tagurl_page=tagurl_.replace('page=','').replace('"','') #仅一页的tag无提前信息,会是空值  
  19.     if tagurl_page!='':#用if为非空值tag指定总页数
  20.         tagurl_page=int(tagurl_page)#str转为int,为下步判断值做准备
  21.         if tagurl_page>3:#多于3页的,只抓取3页
  22.             tagurl_page=3
  23.         if tagurl_page<4:#少于等于3页的,全部抓取
  24.             tagurl_page=tagurl_page        
  25.     else:#空值tag定义为一页
  26.         tagurl_page=1

  27.     for i in range(tagurl_page):
  28.         tag_url='http://movie.douban.com/tag/%s'%text4+'?start=%d&type=T'%(i*20)+'\n'
  29.         #print tag_url
  30.         text3.append(tag_url)
  31. #del text3[-1]
  32. textt=''.join(text3)
  33. b=file('douban_movie10.txt','w')
  34. b.write(textt)
  35. b=file('douban_movie10.txt','r')
  36. a.close()

  37. f=file('douban_movie10.txt','r').read().strip()#strip很关键,之前没有弄,总提示ValueError: unknown url type: 。
  38. n=0
  39. text8=[]#新建空list,方便后面append
  40. for text12 in f.split('\n'):#for in对象需为list,用split将str转为list
  41.     n=n+1
  42.     print n#查看进度 也方便排除问题
  43.     #if text12==' ':#之前为解决ValueError: unknown url type: 特意加的,没有效果。问题应该用strip解决
  44.         #continue
  45.     raw_tagurl_text=urllib2.urlopen(text12).read()#循环打开URL读取
  46.     tagurl_text=re.findall('''http://movie.douban.com/subject/\d{1,}/"  class="">
  47.                         .*?
  48.                         / <span style="font-size:12px;">.*?</span>|<span class="rating_nums">.*?</span>

  49.                            
  50.                             <span class="pl">.*?</span>''',raw_tagurl_text)#初步提取电影信息
  51.     text6=''.join(tagurl_text)
  52.     text7=text6.replace('''</span>

  53.                            
  54.                             <span class="pl">''','\t').replace('''"  class="">
  55.                         ''','\t').replace('</span>','\n').replace('''
  56.                         / <span style="font-size:12px;">''','\t/').replace('\n<span class="rating_nums">','\t')#剔除不需要的信息
  57.     print text7
  58.     text8.append(text7)#将for结果赋值到空list
  59.     text9=''.join(text8)#转str  write要求
  60. e=file('douban_movie11.txt','w')
  61. e.write(text9)
  62. endtime=time.time()
  63. print '用时%ss'%(starttime-endtime)
  64. b.close()
  65. e.close()
复制代码
运行结果:
学习阶段五运行结果
学习总结:1、共有tag130+,取前三页,每页最多20条信息。总共下来约有130*3*20,不到8000.用时-302.459000111s 算是取得阶段性的成果
2、爬虫很糙,只有最简单的逻辑。抓下来的数据不方便存储,不方便进行下一步分析及html编辑。只用到for函数和%。
3、初步了解python爬虫逻辑,初级问题多可以自行解决。接下来需要加强class def 多线程 代理等方面的学习,爬虫智能化
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2014-3-28 11:43:40 |只看该作者
508490571 发表于 2014-3-28 01:10
学习阶段五(update:2013-3-28 0:38):
实现功能:为减少工作量,仅抓取所有tag页下前3页电影信息,不足3页, ...

其实你盯着一个站抓,多线程反而可能会增加请求失败的可能
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

98

积分

注册会员

Rank: 2

5#
发表于 2014-3-28 13:57:43 |只看该作者
crossin先生 发表于 2014-3-28 11:43
其实你盯着一个站抓,多线程反而可能会增加请求失败的可能


其实我都不明白多线程是什么意思。就是在网上资料看到有说多线程会增加速度什么的。就觉得需要熟悉下~
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2014-3-28 15:08:50 |只看该作者
508490571 发表于 2014-3-28 13:57

其实我都不明白多线程是什么意思。就是在网上资料看到有说多线程会增加速度什么的。就觉得需要熟悉下~ ...

多线程就好比你去麦当劳买汉堡,他开好几个柜台,同时接待消费者,速度自然比传统的饭店只有一个收银台要快。
但在做爬虫时,你面对的店家是对方网站,然后你开了好几个门,同时往他店里涌入穿着同样衣服的客人,速度过快了,对方很可能认为你是来踢场子的,拒绝接待。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

7#
发表于 2014-3-28 15:09:07 |只看该作者
508490571 发表于 2014-3-28 13:57

其实我都不明白多线程是什么意思。就是在网上资料看到有说多线程会增加速度什么的。就觉得需要熟悉下~ ...

多线程就好比你去麦当劳买汉堡,他开好几个柜台,同时接待消费者,速度自然比传统的饭店只有一个收银台要快。
但在做爬虫时,你面对的店家是对方网站,然后你开了好几个门,同时往他店里涌入穿着同样衣服的客人,速度过快了,对方很可能认为你是来踢场子的,拒绝接待。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

98

积分

注册会员

Rank: 2

8#
发表于 2014-3-30 23:56:22 |只看该作者
crossin先生 发表于 2014-3-28 15:08
多线程就好比你去麦当劳买汉堡,他开好几个柜台,同时接待消费者,速度自然比传统的饭店只有一个收银台要 ...

哦  好像有点理解了,那我只盯一个站爬,好像也用不上。
现在的想法是把def class运用到程序中,用class让爬到的数据存储形式更利于分析吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 22:49 , Processed in 0.021067 second(s), 27 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部