书签 分享 收藏 举报 版权申诉 / 92

类型Python爬虫实战.docx

  • 文档编号:5150961
  • 上传时间:2022-12-13
  • 格式:DOCX
  • 页数:92
  • 大小:7.05MB
包裹的内容。

现在我们想获取发布人,发布日期,段子内容,以与点赞的个数。

不过另外注意的是,段子有些是带图片的,如果我们想在控制台显示图片是不现实的,所以我们直接把带有图片的段子给它剔除掉,只保存仅含文本的段子。

所以我们参加如下正如此表达式来匹配一下,用到的方法是re.findall是找寻所有匹配的内容。

方法的用法详情可以看前面说的正如此表达式的介绍。

好,我们的正如此表达式匹配语句书写如下,在原来的根底上追加如下代码

1

2

3

4

5

6

content=response.read().decode('utf-8')

pattern=re.pile('

class="author.*?

>.*?

.*?

>(.*?

).*?

class'+

                     '="content".*?

title="(.*?

)">(.*?

(.*?

class="number">(.*?

)',re.S)

items=re.findall(pattern,content)

foriteminitems:

    printitem[0],item[1],item[2],item[3],item[4]

现在正如此表达式在这里稍作说明

1〕.*?

是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?

表示使用非贪婪模式进展匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到.*?

的搭配。

2〕(.*?

)代表一个分组,在这个正如此表达式中我们匹配了五个分组,在后面的遍历item中,item[0]就代表第一个(.*?

)所指代的内容,item[1]就代表第二个(.*?

)所指代的内容,以此类推。

3〕re.S标志代表在匹配时为点任意匹配模式,点.也可以代表换行符。

现在我们可以看一下局部运行结果

儒雅男神2015-02-1714:

34:

42

小时候一个一个拆着放的举个爪…

list=hot&s=4747301″ target=〞_blank〞onclick=〞_hmt.push([‘_trackEvent’,‘post’,‘click’,‘signlePost’])〞>

7093奇怪的名字啊2015-02-1714:

49:

16

回家的路,你追我赶,回家的心情和窗外的阳光一样灿烂。

一路向前,离亲人越来越近了。

哪里有爸妈哪里才是家,希望所有糗友的爸爸妈妈都身体健康…….

4803

这是其中的两个段子,分别打印了发布人,发布时间,发布内容,附加图片以与点赞数。

其中,附加图片的内容我把图片代码整体抠了出来,这个对应item[3],所以我们只需要进一步判断item[3]里面是否含有img这个字样就可以进展过滤了。

好,我们再把上述代码中的for循环改为下面的样子

1

2

3

4

foriteminitems:

        haveImg=re.search("img",item[3])

        ifnothaveImg:

            printitem[0],item[1],item[2],item[4]

现在,整体的代码如下

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

#-*-coding:

utf-8-*-

importurllib

importurllib2

importre

 

page=1

url='.qiushibaike./hot/page/'+str(page)

user_agent='Mozilla/4.0(patible;MSIE5.5;WindowsNT)'

headers={'User-Agent':

user_agent}

try:

    request=urllib2.Request(url,headers=headers)

    response=urllib2.urlopen(request)

    content=response.read().decode('utf-8')

    pattern=re.pile('

class="author.*?

>.*?

.*?

>(.*?

).*?

class'+

                         '="content".*?

title="(.*?

)">(.*?

(.*?

class="number">(.*?

)',re.S)

    items=re.findall(pattern,content)

    foriteminitems:

        haveImg=re.search("img",item[3])

        ifnothaveImg:

            printitem[0],item[1],item[2],item[4]

excepturllib2.URLError,e:

    ifhasattr(e,"code"):

    ifhasattr(e,"reason"):

运行一下看下效果

恩,带有图片的段子已经被剔除啦。

是不是很开森?

3.完善交互,设计面向对象模式

好啦,现在最核心的局部我们已经完成啦,剩下的就是修一下边边角角的东西,我们想达到的目的是:

按下回车,读取一个段子,显示出段子的发布人,发布日期,内容以与点赞个数。

另外我们需要设计面向对象模式,引入类和方法,将代码做一下优化和封装,最后,我们的代码如下所示

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

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

__author__='CQC'

#-*-coding:

utf-8-*-

importurllib

importurllib2

importre

importthread

importtime

 

#糗事百科爬虫类

classQSBK:

 

    #初始化方法,定义一些变量

    def__init__(self):

        self.pageIndex=1

        self.user_agent='Mozilla/4.0(patible;MSIE5.5;WindowsNT)'

        #初始化headers

        self.headers={'User-Agent':

self.user_agent}

        #存放段子的变量,每一个元素是每一页的段子们

        self.stories=[]

        #存放程序是否继续运行的变量

        self.enable=False

    #传入某一页的索引获得页面代码

    defgetPage(self,pageIndex):

        try:

            url='.qiushibaike./hot/page/'+str(pageIndex)

            #构建请求的request

            request=urllib2.Request(url,headers=self.headers)

            #利用urlopen获取页面代码

            response=urllib2.urlopen(request)

            #将页面转化为UTF-8编码

            pageCode=response.read().decode('utf-8')

            returnpageCode

 

        excepturllib2.URLError,e:

            ifhasattr(e,"reason"):

                returnNone

 

 

    #传入某一页代码,返回本页不带图片的段子列表

    defgetPageItems(self,pageIndex):

        pageCode=self.getPage(pageIndex)

        ifnotpageCode:

            print"页面加载失败...."

            returnNone

        pattern=re.pile('

class="author.*?

>.*?

.*?

>(.*?

).*?

class'+

                         '="content".*?

title="(.*?

)">(.*?

(.*?

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

举报
举报
版权申诉
版权申诉
word格式文档无特别注明外均可编辑修改;预览文档经过压缩,下载后原文更清晰! 立即下载
配套讲稿:

如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

特殊限制:

部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

关 键  词:
Python 爬虫 实战
提示  冰豆网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:Python爬虫实战.docx
链接地址:https://www.bdocx.com/doc/5150961.html
相关搜索
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2008-2022 冰点文档网站版权所有

经营许可证编号:鄂ICP备2022015515号-1

收起
展开