python爬⾍实验报告怎么写_[Python]新⼿写爬⾍全过程(转)今天早上起来,第⼀件事情就是理⼀理今天该做的事情,瞬间get到任务,写⼀个只⽤python字符串内建函数的爬⾍,定义为v1.0,开发中的版本号定义为v0.x。数据存放?这个是⼀个练⼿的玩具,就写在txt⽂本⾥吧。其实主要的不是学习爬⾍,⽽是依照这个需求锻炼下⾃⼰的编程能⼒,最重要的是要有⼀个清晰的思路(我在以这个⽬标努⼒着)。ok,主旨已经订好了,开始‘撸串’了。
⽬标:把⼤的⽬标分为⼏个⼩的⽬标。因为第⼀次⼲这个,所以对⾃⼰能⼒很清楚,所以完成顺序由简单到复杂。
1.爬取⼀期的内容,包括标题,和图⽚的url
2.把数据存在本地的txt⽂件中
3.想爬多少就爬就爬少
4.写⼀个⽹站,展⽰⼀下。(纯⽤于学习)
Let‘s 搞定它!
时间——9:14
把昨天晚上做的事情交代⼀下。昨天晚上写的代码实现了爬取⼀期⾥的所有标题。
第⼀步:
我⽤的是google浏览器,进⼊开发者模式,使⽤’页⾯内的元素选择器‘,先看⼀下内页中的结构,到我们要的数据所在’标签‘。
这⾥我们需要的博海拾贝⼀期的内容全部在这个标签⾥⾯,如下图:
第⼀条红线是:页⾯内的元素选择器
第⼆条是:内容所在标签
第三条是:title
经过分析得出,我只要,这个标签的内容:所以写了下⾯的⽅法:
defcontent(html):
#内容分割的标签
str = ''content = html.partition(str)[2]
str1 = '
'content =content.partition(str1)[0]
return content #得到⽹页的内容
partition() ⽅法⽤来根据指定的分隔符将字符串进⾏分割。
如果字符串包含指定的分隔符,则返回⼀个3元的元组,第⼀个为分隔符左边的⼦串,第⼆个为分隔符本⾝,第三个为分隔符右边的⼦串。这样我就得到只有内容的字符串了,⼲净~
第⼆步:
得到title的内容。title的格式如下,我只要’【2】‘后⾯的⽂字,后⾯的img暂时不考虑⼀步步的来。
我写了下⾯的⽅法:
def title(content,beg =0):
#思路是利⽤str.index()和序列的切⽚
try:
title_list =[]
whileTrue:
num1 = content.index('】',beg)
num2 = content.index('
',num1)
title_list.append(content[num1:num2])
beg =num2
exceptValueError:
return title_listpython新手代码错了应该怎么改
这⾥⽤ept是因为我不知道怎么跳出循环。。。。求⼤神有更好的⽅法告诉我。
我这⾥跳出循环⽤的是当抛出VlaueError异常就说明不到了,那就返回列表。就跳出循环了。
num1是】的位置,num2是
的位置,然后⽤序列的切⽚,咔嚓咔嚓⼀下就是我想要的数据了。这⾥需要注意的是:切⽚’要头不要尾‘所以我们的得到的数据就是这个样⼦的:
哎呀,这个是什么⿁!要头不要尾就是这个意思!
然后我就想:那就把num1加1不就完了吗?我真是太天真了。。。。
请+3,我觉得原理是这样的,这个是个中⽂字符!(求⼤神指点)
第三步:
交代清楚我昨天晚上做的事情了,记录下时间——10:01,下⾯我要爬图⽚的url了。这⾥要说⼀下,如果要把图⽚下下来,最重要的⼀步就是得到url,然后下载下来保存到本地(⽤⽂本的IO)。
我先获得url,实现原理同获取title,我在想,既然⼀样卸载获取title的⽅法⾥好,还是在写⼀个⽅法好。我单独写了⼀个⽅法,但是其实就是复制了⼀下title的⽅法,改了下匹配的字符串,代码如下:
def img(content,beg =0):
#思路是利⽤str.index()和序列的切⽚
try:
img_list =[]
whileTrue:
src1 = content.index('http',beg)
src2 = content.index('/>
',src1)
img_list.append(content[src1:src2])
beg =src2
exceptValueError:
return img_list
结果图如下:
这⾥发现,有的时候⼀个title会有很多个图⽚。我思考之后有如下思路:
1.需要写⼀个⽅法,当⼀个title出现多个图⽚的时候,捕获url。这个需要有⼀个判断语句,当url长度⼤于⼀个url长度的时候,才需要调⽤这个函数。
2.多个图⽚的url怎么放?使⽤符号隔开存放还是嵌套放⼊⼀个数组⾥⾯?我这⾥打算⽤’|‘隔开,这样的话加⼀个判语句,或者先判断⼀下url长度,都可以进⾏。
这个问题先放在这⾥,因为当我要下载的时候这个url才需要过滤,所以先进⾏下⼀步,把数据存到本地txt⽂中,这⾥在解决这个问题也不晚。
第四步:
这⾥需要注意的是,⽂本写⼊的时候记得close,还有就是注意打开⽂本的模式。
时间——11:05 吃个饭先
时间——11:44 回来了
这⾥我考虑了⼀个问题,根据《编写⾼质量代码——改善python程序的91个建议》这本书中写道的,字符串连接时,⽤jion()效率⾼
于’+‘
所以我写了如下代码:
defdata_out(data):
#这⾥写成⼀个⽅法好处是,在写⼊⽂本的时候就在这⾥写
fo = open("/home/", "a+") #这⾥注意重新写⼀个地址#for i,e in enumerate(data):
fo.write("\n".join(data));
#print '第%d个,title:%s' % (i,e)
#关闭打开的⽂件
fo.close()
这样造成了⼀个问题,看图
造成最后⼀个和新的⼀个列表写⼊时在同⼀⾏。同时⽤as更好。修改后代码如下:
defdata_out(data):
#写⼊⽂本
with open("/home/", "a+") as fo:
fo.write('\n')
fo.write("\n".join(data));
下⾯研究title和img以什么样的格式存⼊txt⽂本:
title$img
这⾥我有⼀个概念混淆了,+和join()⽅法的效率问题主要在连接多个字符串的时候,我这个只⽤连接⼀次,不需要考虑这个问题。defdata_out(title, img):
#写⼊⽂本
with open("/home/", "a+") as fo:
fo.write('\n')
size =0
for size inrange(0, len(title)):
fo.write(title[size]+'$'+img[size]+'\n');
⽂本中的内容如下:
写⼊⽂本的最后,解决多个图⽚的问题:
def many_img(data,beg =0):
#⽤于匹配多图中的url
try:
many_img_str = ''
whileTrue:
src1 = data.index('http',beg)
src2 = data.index('/> beg =src2
exceptValueError:
returnmany_img_str
defdata_out(title, img):
#写⼊⽂本
with open("/home/", "a+") as fo:
fo.write('\n')
for size inrange(0, len(title)):
#判断img[size]中存在的是不是⼀个url
if len(img[size]) > 70:
img[size] = many_img(img[size])#调⽤many_img()⽅法
fo.write(title[size]+'$'+img[size]+'\n')
输出如下:
暂时功能是实现了,后⾯遇到问题需要修改在改吧。。。。新⼿⾛⼀步看⼀步到此为⽌,已经完成了前两个简单的计划:
1.爬取⼀期的内容,包括标题,和图⽚的url
2.把数据存在本地的txt⽂件中
全部代码如下:
#coding:utf-8
importurllib
>##爬⾍v0.1 利⽤urlib 和 字符串内建函数># defgetHtml(url):
#获取⽹页内容
page =urllib.urlopen(url)
html =ad()
returnhtml
defcontent(html):
#内容分割的标签
str = ''content = html.partition(str)[2]
str1 = '
'content =content.partition(str1)[0]
return content #得到⽹页的内容
def title(content,beg =0):
#匹配title
#思路是利⽤str.index()和序列的切⽚
try:
title_list =[]
whileTrue:
num1 = content.index('】',beg)+3num2 = content.index('
',num1)
title_list.append(content[num1:num2])
beg =num2
exceptValueError:
returntitle_list
def get_img(content,beg =0):
#匹配图⽚的url
#思路是利⽤str.index()和序列的切⽚
try:
img_list =[]
whileTrue:
src1 = content.index('http',beg)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论