- 帖子
- 12
- 精华
- 1
- 积分
- 98
- 阅读权限
- 20
- 注册时间
- 2014-3-11
- 最后登录
- 2014-4-20
|
本帖最后由 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中
代码如下:- # -*- coding: cp936 -*-
- import urllib2
- import re
- text=urllib2.urlopen('http://movie.douban.com/tag/%E7%88%B1%E6%83%85').read()#打开爱情标签
- text1=re.findall(
- r'''"">
- .*?
- / <span style="font-size:12px;">.*?</s|"rating_nums">.*?</span>|"pl">.*?</span>''',text)#正则查找出相对应字符串,list形式
- text2=''.join(text1)#list无法直接replace,需先转为str模式
- text3=text2.replace(
- '<span style="font-size:12px;">','').replace(
- '</s"rating_nums">','').replace(
- '</span>"pl">','').replace(
- '</span>"">','').replace(
- '</span>','').replace(
- '"">','').replace(
- '\n /',':').replace(' ','')#把多余字符替换掉
- w=file('raw_douban_movie.txt','w')
- print text3
- w.write(text3)
- w.close()
复制代码 运行结果如下:
学习总结:1、最开始没有用 join转化为str 直接replace,收到报错数据类型后,直接强行str(text1),结果无法replace只能执行首行。
2、replace用的不忍直视,无奈,只会这一招。先生说先实现功能,再想后期优化 :)
原因解析:findall执行的结果是list,replace执行于str类型,得用join转化。
学习阶段二(update:2014-3-25):
实现功能:代码中加入for循环,批量抓取全部tag,存放到本地txt
代码如下:- # -*- coding: cp936 -*-
- import urllib2
- import re
- raw_text=urllib2.urlopen('http://movie.douban.com/tag/?view=type').read()
- text0=re.findall('"./.*?"',raw_text)#初步抓取tag,findall输出为list
- text1=''.join(text0)#list转str,方便replace
- text2=text1.replace('"./','').replace('"','\n')#tag提取完成
- text3=[]#新建空list,方便后面append
- for text4 in text2.split('\n'):#for in对象需为list,用split将str转为list
- tagurl='http://movie.douban.com/tag/%s'%text4#讲URL前缀同tag拼接,方便后期多tag抓取
- text3.append(tagurl)#循环赋值到空列表
- text5='\n'.join(text3)#排版格式,\n换行符
- e=file('douban_movie6.txt','w')
- e.write(text5)
- e.close()
复制代码 运行结果:
学习总结:1、多用print,不仅可以帮助自己更好的排查错误,也可以更好的理解程序的运行逻辑。
2、多用print type()。现阶段对每种函数生成结果的存储类型还不熟悉,根据想当然的思路写通常会报错,都是数据类型不支持。
3、初步明白for in的用法,对% 用法进一步了解
4、list.append() 进一步了解。接触一种函数不仅要明白怎么用,还得留意函数输出后的数据类型
学习阶段三(update:2014-3-25):
实现功能:抓取所有tag的第一页电影的链接,名字,别名,评分,评价人数。保存到本地txt
代码如下:- # -*- coding: cp936 -*-
- import urllib2
- import re
- import time
- starttime=time.time()
- raw_text=urllib2.urlopen('http://movie.douban.com/tag/?view=type').read()
- text0=re.findall('"./.*?"',raw_text)#初步抓取tag,findall输出为list
- text1=''.join(text0)#list转str,方便replace
- text2=text1.replace('"./','').replace('"','\n')#tag提取完成
- text3=[]#新建空list,方便后面append
- for text4 in text2.split('\n'):#for in对象需为list,用split将str转为list
- tagurl='http://movie.douban.com/tag/%s'%text4#讲URL前缀同tag拼接,方便后期多tag抓取
- text3.append(tagurl)#循环赋值到空列表
- del text3[-1]#最后一行为空tag,不知道生成原因。手动删除。
- text8=[]#新建空list,存储for执行结果
- for text5 in text3:
- raw_tagurl=urllib2.urlopen(text5).read()#打开所有tag页面
- tagurl_text=re.findall('''http://movie.douban.com/subject/\d{1,}/" class="">
- .*?
- / <span style="font-size:12px;">.*?</span>|<span class="rating_nums">.*?</span>
-
- <span class="pl">.*?</span>''',raw_tagurl)#初步提取电影信息
- text6=''.join(tagurl_text)
- text7=text6.replace('''</span>
-
- <span class="pl">''','\t').replace('''" class="">
- ''','\t').replace('</span>','\n').replace('''
- / <span style="font-size:12px;">''','\t/').replace('\n<span class="rating_nums">','\t')#剔除不需要的信息
- text8.append(text7)#将for结果赋值到空list
- text9=''.join(text8)#转str write要求
- e=file('douban_movie7.txt','w')
- e.write(text9)
- endtime=time.time()
- print '用时%ss'%(starttime-endtime)
- e.close()
复制代码 运行结果:
用时-75.5190000534s
学习总结:1、初步接触time,从@jxgx072037的豆瓣代码中看到就拿来用了。2、代码还是很初级,只能抓取所有标签的第一页,用时75s,耗时应该有点长。
还需实现的功能:抓取每个标签下的多页电影信息,去重,排序。
学习阶段四(update:2014-3-26):
实现功能:整理单个tag下的所有页面链接
代码如下:- # -*- coding: cp936 -*-
- import urllib2
- import re
- raw_text=urllib2.urlopen('http://movie.douban.com/tag/cult').read()#指定打开cult标签页
- text0=re.findall('page="\d{1,}"',raw_text)#初步提取总页面数,人工查看代码后发现page="\d{1,}表示总页面
- text1=''.join(text0)
- text2=text1.replace('page=','').replace('"','')#得出总页面的具体值
- text5=[]
- for text3 in range(int(text2)):#range生成页面数列表,循环读取
- text4='http://movie.douban.com/tag/cult?start=%d&type=T'%(text3*20)+'\n'#人工发现url规律为页面数*20, 最后\n为排版需要
- text5.append(text4)
- text6=''.join(text5)
- e=file('douban_movie8.txt','w')
- e.write(text6)
- e.close()
复制代码 运行结果:
学习总结:range(int(text2))和%(text3*20)可减少代码行数
PS:本想再继续添加,字数限制,后期学习笔记就放到回复里了
|
|