第一只爬虫---糗事百科

目标:

(1)抓取糗事百科热门段子,发布人,发布内容,好笑数,评论数

(2)过滤带有图片的段子

(3)将爬取到的数据保存到Excel中

1.确定URL,抓取页面代码 获取某一页的内容

import urllib.request
from urllib.request import urlopen
import urllib.error
import re
#糗事百科爬虫类
class QSBK:
    #初始化方法,定义一些变量
    def __init__(self):
        self.pageNum=1
        self.baseUrl=baseUrl
    #传入某一页的索引获取页面代码
    def getPage(self,pageNum):
        try:
            url=self.baseUrl+str(pageNum)+'/?s=4971324'
            headers={'User-Agent':"Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0"}
            request=urllib.request.Request(url,headers=headers)
            response=urllib.request.urlopen(request)
            # print(response.read())
            return response.read().decode('utf-8')
        except urllib.error.URLError as e:
            if hasattr(e,'reason'):
                print(u'连接糗事百科失败,错误原因:',e.reason)
                return None
    #传入某一页代码,返回本页信息
    def getPageInfo(self,pageNum):
        # pattern=re.compile('<div class="author clearfix">.*?<h2>(.*?)</h2>.*?class="content".*?<span>(.*?)</span>.*?<div class="stats">.*?class=class="number">(.*?)</i>.*?<span class="stats-comments">.*? class="number">(.*?)</i>',re.S)
        pattern=re.compile('<div class="author clearfix">.*?<h2>(.*?)</h2>.*?class="content".*?<span>(.*?)</span>.*?<div class="stats">.*?class="number">(.*?)</i>.*?<span class="stats-comments">.*?class="number">(.*?)</i>',re.S)
        items=re.findall(pattern,pageNum)
        for item in items:
            # item[0]发布人 item[1] 发布内容 item[2] 好笑数 item[3] 评论数
            print(item[0],item[1],item[2],item[3])
baseUrl='http://www.qiushibaike.com/8hr/page/'
spider=QSBK()
qsbk=spider.getPageInfo(spider.getPage(1))
部分运行结果:

欧阳家二姐 老公开了个面条店,旁边两家是卖水饺和麻辣烫的,时间长了,大家吃自家的东西都吃腻了,外面吃又不舍花钱,就三家商量着,用自己的东西互换着吃。<br/><br/>一到中午,连老板带员工一共十二个人,你进我家我进你家,光吃不用钱,把旁边一家卖花圈的眼红的不要不要的…… 16948 346
眼前春色 侄子调皮,摔断了一个胳膊,打的石膏,就这还是非常调皮,昨天翻墙另一个胳膊撑地上脱臼了,就这样两个胳膊全部吊了起来。晚上堂哥一家来我家吃饭,老爹见着第一句话就是:来就来,还带个螃蟹…… 9879 82
绦子 我有个可爱的朋友叫老黄。有一次老黄失恋了,和他爱情长跑三周的女友分手了,老黄很伤心,而且酒卡快过期了,我们就出去买醉。就是我买单,他喝醉。<br/>喝完之后我们坐地铁准备回家,老黄已经进入了一种很茫的状态。经常喝酒的盆友一定懂,这种时候其实脑子还能保持基本的清醒,但是行为已经不受控制了,还经常有各种奇思妙想,感觉自己就他娘的像个诗人。<br/>我们在地铁上坐了一站,上来一个聋哑人姑娘,大家肯定都见过,就是那种自称聋哑人拿着一张小卡片,让你献爱心的套路。一般这种套路只有两种选择,狠心拒绝或者给钱当傻子。姑娘从车头... 9448 840
走着走着!就散了 有一个女性朋友,胸比较小,有一天她很生气的找我聊天,我问她怎么了,她说她发朋友圈说内衣被偷了,结果有人评论说谁眼瞎会偷你胸罩,偷去当眼罩吗?等等,让姐先笑会! 7871 100

import urllib.request
from urllib.request import urlopen
import urllib.error
import csv
import re
import os
#糗事百科爬虫类
class QSBK:
    #初始化方法,定义一些变量
    def __init__(self):
        self.pageNum=1
        self.baseUrl=baseUrl
        # self.file=None
    #传入某一页的索引获取页面代码
    def getPage(self,pageNum):
        try:
            url=self.baseUrl+str(pageNum)+'/?s=4971324'
            headers={'User-Agent':"Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0"}
            request=urllib.request.Request(url,headers=headers)
            response=urllib.request.urlopen(request)
            # print(response.read())
            return response.read().decode('utf-8')
        except urllib.error.URLError as e:
            if hasattr(e,'reason'):
                print(u'连接糗事百科失败,错误原因:',e.reason)
                return None
    #传入某一页代码,返回本页信息
    def getPageInfo(self,pageNum):
        # pattern=re.compile('<div class="author clearfix">.*?<h2>(.*?)</h2>.*?class="content".*?<span>(.*?)</span>.*?<div class="stats">.*?class=class="number">(.*?)</i>.*?<span class="stats-comments">.*? class="number">(.*?)</i>',re.S)
        pattern=re.compile('<div class="author clearfix">.*?<h2>(.*?)</h2>.*?class="content".*?<span>(.*?)</span>.*?<div class="stats">.*?class="number">(.*?)</i>.*?<span class="stats-comments">.*?class="number">(.*?)</i>',re.S)
        items=re.findall(pattern,pageNum)
        contents=[]
        for item in items:
            # item[0]发布人 item[1] 发布内容 item[2] 好笑数 item[3] 评论数
            # print(item[0],item[1],item[2],item[3])
            contents.append([item[0].strip(),item[1].strip(),item[2].strip(),item[3].strip()])
        return contents
    def write_data(self,contents):
        csvFile=open('csv.qiubai.csv','a',newline='',encoding='utf-8')
        try:
            writer=csv.writer(csvFile)
            writer.writerow(('发布人','发布内容','好笑数','评论数'))
            for item in contents:
                writer.writerow(item)
        finally:
            csvFile.close()
    def deleteOldTxt(self):
        filename='csv.qiubai.csv'
        if os.path.exists(filename):
            os.remove(filename)
            print('\n发现旧名单,已删除\n采集开始\n')
    def start(self):
        print('正在读取糗事百科')
        indexPage=self.getPage(1)
        # pageinfo=self.getPageInfo(indexPage)
        try:
            for i in range(1,36):
                print('正在写入第'+str(i)+'页数据')
                page=self.getPage(i)
                contents=self.getPageInfo(page)
                print(contents)
                self.write_data(contents)

        except IOError as e:
            print('写入异常,原因'+e.message)
        finally:
            print('写入任务完成')
baseUrl='http://www.qiushibaike.com/8hr/page/'
spider=QSBK()
spider.deleteOldTxt()
qsbk=spider.start()
部分运行结果:

存在的问题:段子内容中有<br>标签,需要过滤掉



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值