Python爬虫实战.docx

上传人:b****2 文档编号:2165741 上传时间:2022-10-27 格式:DOCX 页数:94 大小:7.05MB
下载 相关 举报
Python爬虫实战.docx_第1页
第1页 / 共94页
Python爬虫实战.docx_第2页
第2页 / 共94页
Python爬虫实战.docx_第3页
第3页 / 共94页
Python爬虫实战.docx_第4页
第4页 / 共94页
Python爬虫实战.docx_第5页
第5页 / 共94页
点击查看更多>>
下载资源
资源描述

Python爬虫实战.docx

《Python爬虫实战.docx》由会员分享,可在线阅读,更多相关《Python爬虫实战.docx(94页珍藏版)》请在冰豆网上搜索。

Python爬虫实战.docx

Python爬虫实战

Python爬虫实战

Python爬虫实战

(1):

爬取糗事百科段子

大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧。

那么这次为大家带来,Python爬取糗事百科的小段子的例子。

首先,糗事百科大家都听说过吧?

糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来。

本篇目标

1.抓取糗事百科热门段子

2.过滤带有图片的段子

3.实现每按一次回车显示一个段子的发布时间,发布人,段子容,点赞数。

糗事百科是不需要登录的,所以也没必要用到Cookie,另外糗事百科有的段子是附图的,我们把图抓下来图片不便于显示,那么我们就尝试过滤掉有图的段子吧。

好,现在我们尝试抓取一下糗事百科的热门段子吧,每按下一次回车我们显示一个段子。

1.确定URL并抓取页面代码

首先我们确定好页面的URL是.qiushibaike./hot/page/1,其中最后一个数字1代表页数,我们可以传入不同的值来获得某一页的段子容。

我们初步构建如下的代码来打印页面代码容试试看,先构造最基本的页面抓取方式,看看会不会成功

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#-*-coding:

utf-8-*-

importurllib

importurllib2

 

 

page=1

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

try:

    request=urllib2.Request(url)

    response=urllib2.urlopen(request)

    printresponse.read()

excepturllib2.URLError,e:

    ifhasattr(e,"code"):

        printe.code

    ifhasattr(e,"reason"):

        printe.reason

运行程序,哦不,它竟然报错了,真是时运不济,命途多舛啊

1

2

3

line373,in_read_status

 raiseBadStatusLine(line)

httplib.BadStatusLine:

''

好吧,应该是headers验证的问题,我们加上一个headers验证试试看吧,将代码修改如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#-*-coding:

utf-8-*-

importurllib

importurllib2

 

page=1

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

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

headers={'User-Agent':

user_agent}

try:

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

    response=urllib2.urlopen(request)

    printresponse.read()

excepturllib2.URLError,e:

    ifhasattr(e,"code"):

        printe.code

    ifhasattr(e,"reason"):

        printe.reason

嘿嘿,这次运行终于正常了,打印出了第一页的HTML代码,大家可以运行下代码试试看。

在这里运行结果太长就不贴了。

2.提取某一页的所有段子

好,获取了HTML代码之后,我们开始分析怎样获取某一页的所有段子。

首先我们审查元素看一下,按浏览器的F12,截图如下

我们可以看到,每一个段子都是

包裹的容。

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

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

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

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

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

1

2

3

4

5

6

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

pattern=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(compatible;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=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"):

        printe.code

    ifhasattr(e,"reason"):

        printe.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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

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