class="number">(.*?
)',re.S)
items=re.findall(pattern,pageCode)
#用来存储每页的段子们
pageStories=[]
#遍历正如此表达式匹配的信息
foriteminitems:
#是否含有图片
haveImg=re.search("img",item[3])
#如果不含有图片,把它参加list中
ifnothaveImg:
#item[0]是一个段子的发布者,item[1]是发布时间,item[2]是内容,item[4]是点赞数
pageStories.append([item[0].strip(),item[1].strip(),item[2].strip(),item[4].strip()])
returnpageStories
#加载并提取页面的内容,参加到列表中
defloadPage(self):
#如果当前未看的页数少于2页,如此加载新一页
ifself.enable==True:
iflen(self.stories)<2:
#获取新一页
pageStories=self.getPageItems(self.pageIndex)
#将该页的段子存放到全局list中
ifpageStories:
self.stories.append(pageStories)
#获取完之后页码索引加一,表示下次读取下一页
self.pageIndex+=1
#调用该方法,每次敲回车打印输出一个段子
defgetOneStory(self,pageStories,page):
#遍历一页的段子
forstoryinpageStories:
#等待用户输入
input=raw_input()
#每当输入回车一次,判断一下是否要加载新页面
self.loadPage()
#如果输入Q如此程序完毕
ifinput=="Q":
self.enable=False
return
printu"第%d页\t发布人:
%s\t发布时间:
%s\n%s\n赞:
%s\n"%(page,story[0],story[1],story[2],story[3])
#开始方法
defstart(self):
printu"正在读取糗事百科,按回车查看新段子,Q退出"
#使变量为True,程序可以正常运行
self.enable=True
#先加载一页内容
self.loadPage()
#局部变量,控制当前读到了第几页
nowPage=0
whileself.enable:
iflen(self.stories)>0:
#从全局list中获取一页的段子
pageStories=self.stories[0]
#当前读到的页数加一
nowPage+=1
#将全局list中第一个元素删除,因为已经取出
delself.stories[0]
#输出该页的段子
self.getOneStory(pageStories,nowPage)
spider=QSBK()
spider.start()
好啦,大家来测试一下吧,点一下回车会输出一个段子,包括发布人,发布时间,段子内容以与点赞数,是不是感觉爽爆了!
我们第一个爬虫实战项目介绍到这里,欢迎大家继续关注,小伙伴们加油!
Python爬虫实战〔2〕:
XX贴吧帖子
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取XX贴吧的帖子。
与上一篇不同的是,这次我们需要用到文件的相关操作。
本篇目标
首先,我们先观察一下XX贴吧的任意一个帖子。
比如:
tieba.baidu./p/3138733512?
see_lz=1&pn=1,这是一个关于NBA50大的盘点,分析一下这个地址。
1
2
3
4
代表资源传输使用协议
tieba.baidu.是XX的二级域名,指向XX贴吧的服务器。
/p/3138733512是服务器某个资源,即这个帖子的地址定位符
see_lz和pn是该URL的两个参数,分别代表了只看楼主和帖子页码,等于1表示该条件为真
所以我们可以把URL分为两局部,一局部为根底局部,一局部为参数局部。
例如,上面的URL我们划分根底局部是 tieba.baidu./p/3138733512,参数局部是 ?
see_lz=1&pn=1
熟悉了URL的格式,那就让我们用urllib2库来试着抓取页面内容吧。
上一篇糗事百科我们最后改成了面向对象的编码方式,这次我们直接尝试一下,定义一个类名叫BDTB(XX贴吧),一个初始化方法,一个获取页面的方法。
其中,有些帖子我们想指定给程序是否要只看楼主,所以我们把只看楼主的参数初始化放在类的初始化上,即init方法。
另外,获取页面的方法我们需要知道一个参数就是帖子页码,所以这个参数的指定我们放在该方法中。
综上,我们初步构建出根底代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
__author__='CQC'
#-*-coding:
utf-8-*-
importurllib
importurllib2
importre
#XX贴吧爬虫类
classBDTB:
#初始化,传入基地址,是否只看楼主的参数
def__init__(self,baseUrl,seeLZ):
self.baseURL=baseUrl
self.seeLZ='?
see_lz='+str(seeLZ)
#传入页码,获取该页帖子的代码
defgetPage(self,pageNum):
try:
url=self.baseURL+self.seeLZ+'&pn='+str(pageNum)
request=urllib2.Request(url)
response=urllib2.urlopen(request)
printresponse.read()
returnresponse
excepturllib2.URLError,e:
ifhasattr(e,"reason"):
returnNone
baseURL='tieba.baidu./p/3138733512'
bdtb=BDTB(baseURL,1)
bdtb.getPage
(1)
运行代码,我们可以看到屏幕上打印出了这个帖子第一页楼主发言的所有内容,形式为HTML代码。
1〕提取帖子标题
首先,让我们提取帖子的标题。
在浏览器中审查元素,或者按F12,查看页面源代码,我们找到标题所在的代码段,可以发现这个标题的HTML代码是
1
396px">纯原创我心中的NBA2014-2015赛季现役5
展开阅读全文
相关搜索