码迷,mamicode.com
首页 > 编程语言 > 详细

Python爬虫实战-爬取糗事百科段子

时间:2015-05-08 21:51:04      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

1.本文的目的是练习Web爬虫

目标:

1.爬去糗事百科热门段子

2.去除带图片的段子

3.获取段子的发布时间,发布人,段子内容,点赞数。

2.首先我们确定URL为http://www.qiushibaike.com/hot/page/10(可以随便自行选择),先构造看看能否成功

构造代码:

技术分享
 1 # -*- coding:utf-8 -*-
 2 import urllib
 3 import urllib2
 4 import re
 5 
 6 page = 10
 7 url = http://www.qiushibaike.com/hot/page/ + str(page)
 8 user_agent = Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)
 9 headers = { User-Agent : user_agent }
10 try:
11     request = urllib2.Request(url,headers = headers)
12     response = urllib2.urlopen(request)
13     content = response.read()
14     print content
15 except urllib2.URLError, e:
16     if hasattr(e,"code"):
17         print e.code
18     if hasattr(e,"reason"):
19         print e.reason
View Code

成功构造,但是有乱码情况,不用担心,我们只需将:

content = response.read()

替换为

content = response.read().decode(UTF-8)

3.提取段子前,我们必须,必须分析页面构造

技术分享

4.好了看看页面的构造,我们可以写正则来匹配,代码入如下:

pattern = re.compile(<div.*?class="author.*?>.*?<a.*?</a>.*?<a.*?>(.*?)</a>.*?<div.*?class+="content".*?>(.*?)</div>(.*?)<div class="stats.*?class="number">(.*?)</i>,re.S)
    items = re.findall(pattern,content)
    for item in items:
        haveImg = re.search("img",item[2])
        if not haveImg:
            print item[0],item[1],item[2],item[3]

其中:

(1)  .*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配

(2)  (.*?)代表一个分组,在这个正则表达式中我们匹配了五个分组,在后面的遍历item中,item[0]就代表第一个(.*?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推

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

(4)  img 是去除匹配的图片标签

通过以上的实验,得到最终的实验代码:

技术分享
 1 # -*- coding:utf-8 -*-
 2 import urllib
 3 import urllib2
 4 import re
 5 
 6 page = 10
 7 url = http://www.qiushibaike.com/hot/page/ + str(page)
 8 user_agent = Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)
 9 headers = { User-Agent : user_agent }
10 try:
11     request = urllib2.Request(url,headers = headers)
12     response = urllib2.urlopen(request)
13     content = response.read().decode(utf-8)
14     pattern = re.compile(<div.*?class="author.*?>.*?<a.*?</a>.*?<a.*?>(.*?)</a>.*?<div.*?class+="content".*?>(.*?)</div>(.*?)<div class="stats.*?class="number">(.*?)</i>,re.S)
15     items = re.findall(pattern,content)
16     for item in items:
17         haveImg = re.search("img",item[2])
18         if not haveImg:
19             print item[0],item[1],item[2],item[3]
20 except urllib2.URLError, e:
21     if hasattr(e,"code"):
22         print e.code
23     if hasattr(e,"reason"):
24         print e.reason
View Code

参考:http://cuiqingcai.com/990.html

 

Python爬虫实战-爬取糗事百科段子

标签:

原文地址:http://www.cnblogs.com/sxmcACM/p/4488738.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!