今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x。数据存放?这个是一个练手的玩具,就写在txt文本里吧。其实主要的不是学习爬虫,而是依照这个需求锻炼下自己的编程能力,最重要的是要有一个清晰的思路(我在以这个目标努力着)。ok,主旨已经订好了,开始‘撸串’了。

目标网站:http://bohaishibei.com/post/category/main/(一个很有趣的网站,一段话配一个图,老有意思了~)网站形式如下:

目标:把大的目标分为几个小的目标。因为第一次干这个,所以对自己能力很清楚,所以完成顺序由简单到复杂。

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 #得到网页的内容

这里需要说一下:在写这个爬虫之前我就打算只用字符串的内置函数来处理匹配问题,所以我就上http://www.w3cschool.cc/python/进入到字符串页面,大致看了一遍字符串的内建函数有哪些。

partition() 方法用来根据指定的分隔符将字符串进行分割。

如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。

partition() 方法是在2.5版中新增的。参考:http://www.w3cschool.cc/python/att-string-partition.html

这样我就得到只有内容的字符串了,干净~

第二步:

得到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=num2exceptValueError:return title_list

这里用try....except是因为我不知道怎么跳出循环。。。。求大神有更好的方法告诉我。

我这里跳出循环用的是当抛出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=src2exceptValueError:return img_list

结果图如下:

这里发现,有的时候一个title会有很多个图片。我思考之后有如下思路:

1.需要写一个方法,当一个title出现多个图片的时候,捕获url。这个需要有一个判断语句,当url长度大于一个url长度的时候,才需要调用这个函数。

2.多个图片的url怎么放?使用符号隔开存放还是嵌套放入一个数组里面?我这里打算用’|‘隔开,这样的话加一个判语句,或者先判断一下url长度,都可以进行。

这个问题先放在这里,因为当我要下载的时候这个url才需要过滤,所以先进行下一步,把数据存到本地txt文中,这里在解决这个问题也不晚。

第四步:

把数据存到本地的txt中。Python文件IO参考资料:http://www.w3cschool.cc/python/python-files-io.html

这里需要注意的是,文本写入的时候记得close,还有就是注意打开文本的模式。

时间——11:05 吃个饭先

时间——11:44 回来了

这里我考虑了一个问题,根据《编写高质量代码——改善python程序的91个建议》这本书中写道的,字符串连接时,用jion()效率高于’+‘

所以我写了如下代码:

defdata_out(data):#这里写成一个方法好处是,在写入文本的时候就在这里写

fo = open("/home/qq/data.txt", "a+") #这里注意重新写一个地址#for i,e in enumerate(data):

fo.write("\n".join(data));#print '第%d个,title:%s' % (i,e)

#关闭打开的文件

fo.close()

这样造成了一个问题,看图

造成最后一个和新的一个列表写入时在同一行。同时用with....as更好。修改后代码如下:

defdata_out(data):#写入文本

with open("/home/qq/foo.txt", "a+") as fo:

fo.write('\n')

fo.write("\n".join(data));

下面研究title和img以什么样的格式存入txt文本:

title$img

这里我有一个概念混淆了,+和join()方法的效率问题主要在连接多个字符串的时候,我这个只用连接一次,不需要考虑这个问题。

defdata_out(title, img):#写入文本

with open("/home/qq/foo.txt", "a+") as fo:

fo.write('\n')

size=0

for size inrange(0, len(title)):

fo.write(title[size]+'$'+img[size]+'\n');

文本中的内容如下:

愿你贪吃不胖,愿你懒惰不丑,愿你深情不被辜负。$http://ww1.sinaimg.cn/mw690/005CfBldtw1etay8dl1bsj30c50cbq4m.jpg"

这是我最近的状态,请告诉我不是我一个人!$http://ww4.sinaimg.cn/mw690/005CfBldtw1etay8ifthnj30an0aot8w.jpg

引诱别人和你击拳庆祝,然后偷偷把手势变成二,就可以合体成为蜗牛cosplay……$http://ww2.sinaimg.cn/mw690/005CfBldtw1etay8fzm1sg30b40644qq.gif

原来蜗牛是酱紫吃东西的。。。。涨姿势!$http://ww4.sinaimg.cn/mw690/005CfBldtw1etay8egg8vg30bo08ax6p.gif

写入文本的最后,解决多个图片的问题:

def many_img(data,beg =0):#用于匹配多图中的url

try:

many_img_str= ''

whileTrue:

src1= data.index('http',beg)

src2= data.index('/>

beg =src2exceptValueError:returnmany_img_strdefdata_out(title, img):#写入文本

with open("/home/qq/data.txt", "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')

输出如下:

元气少女陈意涵 by @TopFashionStyle$http://ww2.sinaimg.cn/mw690/005CfBldtw1etay848iktj30bz0bcq4x.jpg|http://ww1.sinaimg.cn/mw690/005CfBldtw1etay83kv5pj30c10bkjsr.jpg|http://ww3.sinaimg.cn/mw690/005CfBldtw1etay82qdvsj30c10bkq3z.jpg|http://ww1.sinaimg.cn/mw690/005CfBldtw1etay836z8lj30c00biq40.jpg|http://ww4.sinaimg.cn/mw690/005CfBldtw1etay8279qmj30ac0a0q3p.jpg|http://ww1.sinaimg.cn/mw690/005CfBldtw1etay81ug5kj30c50bnta6.jpg|http://ww2.sinaimg.cn/mw690/005CfBldtw1etay8161ncj30c20bgmyt.jpg|http://ww2.sinaimg.cn/mw690/005CfBldtw1etay804oy7j30bs0bgt9r.jpg|

暂时功能是实现了,后面遇到问题需要修改在改吧。。。。新手走一步看一步!!!

到此为止,已经完成了前两个简单的计划:

1.爬取一期的内容,包括标题,和图片的url

2.把数据存在本地的txt文件中

全部代码如下:

#coding:utf-8

importurllib#######爬虫v0.1 利用urlib 和 字符串内建函数######

defgetHtml(url):#获取网页内容

page =urllib.urlopen(url)

html=page.read()returnhtmldefcontent(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=num2exceptValueError:returntitle_listdef get_img(content,beg =0):#匹配图片的url

#思路是利用str.index()和序列的切片

try:

img_list=[]whileTrue:

src1= content.index('http',beg)

src2= content.index('/>

',src1)

img_list.append(content[src1:src2])

beg=src2exceptValueError:returnimg_listdef many_img(data,beg =0):#用于匹配多图中的url

try:

many_img_str= ''

whileTrue:

src1= data.index('http',beg)

src2= data.index('/>

beg =src2exceptValueError:returnmany_img_strdefdata_out(title, img):#写入文本

with open("/home/qq/data.txt", "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')

content= content(getHtml("http://bohaishibei.com/post/10475/"))

title=title(content)

img=get_img(content)

data_out(title, img)#实现了爬的单个页面的title和img的url并存入文本

时间——15:14

下面要重新分析网站,我已经可以获得一期的内容了,我现在要得到,其它期的url,这样就想爬多少就爬多少了。

目标网址:http://bohaishibei.com/post/category/main/

按照上面的方法进入开发者模式分析网站结构,找出目标数据所在的标签,撸它!

在首页中需要的数据全部都在

标签里,分隔方法如下:

defmain_content(html):#首页内容分割的标签

str = '

'content= html.partition(str)[2]

str1= '

'content=content.partition(str1)[0]return content #得到网页的内容

我暂时需要的数据:每一期的名字和每一期的url。

经过我的分析:该网站的每期的url格式是这样的:"http://bohaishibei.com/post/10189/"只有数字是变化的。

后来我又发现,我想要的这两个数据都在

这个标签下面,获取每期url的方法如下:

def page_url(content, beg =0):try:

url=[]whileTrue:

url1= content.index('

url.append(content[url1:url2])

beg =url2exceptValueError:return url

title的格式,

我思考了一下,我要title其实没什么太大的意思,用户有不可能说我要看那期,只需要输入看多少期就可以了,标题没有什么实际意义(不像内容中的title是帮助理解改张图笑点的)。所以我打算在这个版本中只实现,你输入想查看要多少期,就返回多少期!

那么下面就需要一个策略了:

http://bohaishibei.com/post/category/main/ 共20期

http://bohaishibei.com/post/category/main/page/2/ 共20期

......

经查看,每页都是20期

当你要查看的期数,超过20期的时候需要,增加page的数值,进入下一页进行获取

最后一页为这个:http://bohaishibei.com/post/category/main/page/48/

实现代码,这个我要想一想怎么写,我是第一次写爬虫,不要嘲讽我啊!

时间——17:09

感觉快实现了,还在写:

defget_order(num):

page= num / 20order= num % 20 #超出一整页的条目

for i in range(1, page+1): #需这里需要尾巴

url = 'http://bohaishibei.com/post/category/main/page/%d' %iprinturlif (i == page)&(order >0):

url= 'http://bohaishibei.com/post/category/main/page/%d' % (i+1)print url+",%d条" % order

get_order(55)

运行结果:

http://bohaishibei.com/post/category/main/page/1http://bohaishibei.com/post/category/main/page/2http://bohaishibei.com/post/category/main/page/3,15条2

~~~~~~~~~~~~

15

这里我考虑是这样的我需要重写 page_url,需要多加一个参数,如下:

#新增一个参数order,默认为20

def page_url(content, order = 20, beg =0):try:

url=[]

i=0while i

url1= content.index('

img_list.append(content[src1:src2])

beg=src2exceptValueError:return img_list

主函数:

order = get_order(30) #get_order方法接受参数,抓取多少期的数据

for i in order: #遍历列表的方法

html =getHtml(i)

content_data=content(html)

title_data=title(content_data)

img_data=get_img(content_data)

data_out(title_data, img_data)

爬下来的数据:

data.txt属性(共30期的数据):

终于写完了!

开始时间——9:14

写爬虫,吃饭,洗澡,休息了一会。

结束时间——21:02

呼,没有半途而废就知足了,感觉这样把写爬虫的流程走了一遍下次再写的话会快一些吧。

爬虫是写完了,但是用网站显示还没有写,明天看如果没事就把网站写出来。

图片下载的功能,我还没有写,等写网站的时候再把它完善出来。

总结:

整个过程,纯手写,没有参考别人的代码。这一点可以赞一下。

这次写爬虫就是强制自己不用正则表达式,和XPATH,发现有很多地方,用这两个会很方便。这让我下定决心去学正则表达式和Xpath,哈哈。体会过才有深有感触。

下一个目标是学习正则表达式和Xpath。一点点来,当我学完就来写爬虫v2.0,逐步完善吧,如果上来就要写难得,我的智商着急啊!

然后多看看别人的爬虫,学习别人厉害的地方,提高自己。

欢迎大家指导交流。

完整的代码我已经上传到我的github上了,地址为:https://github.com/521xueweihan/PySpider/blob/master/Spider.py

python爬虫课程设计过程_[Python]新手写爬虫全过程(已完成)相关推荐

  1. python网络爬虫课程设计题目_山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》...

    山东建筑大学计算机网络课程设计<基于Python的网络爬虫设计> 山东建筑大学 课 程 设 计 成 果 报 告 题 目: 基于Python的网络爬虫设计 课 程: 计算机网络A 院 (部) ...

  2. python爬虫课程设计摘要_爬虫课程设计(爬虫代码)

    import bs4 from selenium import webdriver import time import pymysql import csv def getWebDriver(url ...

  3. python五子棋课程设计报告_五子棋课程设计报告

    智力 ,而且富含 哲理 ,有助于修身养性 . 五子棋相传起源于四千多年前的尧帝时期,比 围棋 的历史还要悠久,可能早在 " 尧造围棋 " 之前, 民间就已有五子棋游戏 . 有关早期 ...

  4. python俄罗斯方块课程设计报告_用python实现俄罗斯方块

    !/usr/bin/python -- conding:utf-8 -- from tkinter import * import time import threading import rando ...

  5. 图书管理系统python代码课程设计报告_数据结构图书管理系统课程设计报告

    1 一.设计题目与要求 [ 问题描述 ] 设计一个计算机管理系统完成图书管理基本业务. [ 基本要求 ] ( 1) 每种书的登记内容包括书号.书名.著作者.现存量和库存量: ( 2) 对书号建立索引表 ...

  6. python五子棋课程设计报告_算法课程设计:使用Python完成可视化的五子棋AI

    from enum import IntEnum import pygame from pygame.locals import * import copy import time version = ...

  7. python抽取指定url页面的title_Python新手写爬虫全过程记录分析

    目标网站:http://bohaishibei.com/post/category/main/(一个很有趣的网站,一段话配一个图,老有意思了-)网站形式如下: 目标:把大的目标分为几个小的目标.因为第 ...

  8. 关于python爬虫课程设计

    文章目录 题目简介 目标定义 .流程图 4.实现/5.分析 全部代码 python爬虫课程设计 背单词吧 题目简介 大学四年中,必不可少的证就是英语四六级证书,我们的项目可以通过pycharm来对我们 ...

  9. Python数据处理课程设计-房屋价格预测

    注:可能有些图片未能成功上传,可在文档处进行下载 链接:Python数据处理课程设计-房屋价格预测-机器学习文档类资源-CSDN下载 课程设计报告 课程名称 Python数据处理课程设计 项目名称 房 ...

最新文章

  1. spring 数组中随机取几个_别给孩子取这三种名字!截止年末,名字中的这几个字已经烂大街了...
  2. (已解决)pycharm调试报错-UnicodeDecodeError:‘utf-8‘ codec can‘t decode byte 0xe8 in position 1023
  3. 自动驾驶第一案结果敲定,谷歌无人驾驶和Uber达成2.5亿美元和解协议
  4. TensorFlow如何充分使用所有CPU核数,提高TensorFlow的CPU使用率,以及Intel的MKL加速
  5. 7.21.05 中断流程控制语句
  6. sql中去掉换行符和回车符
  7. (转)Docker volume plugin - enabled create local volume on docker host
  8. 在webservice中传递Hashtable
  9. 前端学习(1598):ref转发
  10. IO_ADDRESS()的实现【转】
  11. java乘法表_Java中四种9*9乘法表的实现方式(附代码)
  12. Microsoft Enterprise Library 5.0 系列(十) Configuration Application Block
  13. oracle新建对象 权限管理
  14. wps启用编辑按钮在哪里_WPS 新功能上线,官宣首发!人人都会用的图片设计
  15. str split函数 php,怎么在php中利用str_split函数分割字符串
  16. idea安装插件及java开发插件推荐
  17. 智能交通——车辆属性识别
  18. 【死磕DDD】聊聊领域建模方法论
  19. Java程序员职业发展规划和方向有哪些?
  20. 2.1.2 激光雷达

热门文章

  1. PTA团体天梯赛汇总
  2. 三维重建 影像匹配 密集匹配三者的关系
  3. java构造方法时对象初始化,实例化,参数赋值
  4. JAVA:实现十进制转二进制算法(附完整源码)
  5. Apple Watch必备!KUNER充电表带登场
  6. Python-正则表达式
  7. Jetson Nano复制系统和U盘启动【第三部分】
  8. 他们用折纸解决了两个数学难题,还折出了天文望远镜!!
  9. redist 在linux上的安装教程
  10. 利用matlab从TXT中读数据1