目标:
(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>标签,需要过滤掉