企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
``` #!python2 #-*- coding=UTF-8 -*- #糗事百科爬取段子 #python version 2.7 import urllib2 import re import time import thread import MySQLdb import sys reload(sys) sys.setdefaultencoding( "utf-8" ) class Reptile: #初始化,定义变量 def __init__(self): self.pageIndex = 1 self.user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' #初始化heades self.headers = {'User-Agent': self.user_agent} #存放段子的变量,每一个元素是每一页的段子们 self.stories = [] #存放程序是否继续运行的变量 self.enable = False #传入页面获取页面代码 def getPage(self, pageIndex): try: url = url = "http://www.qiushibaike.com/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') return pageCode except urllib2.URLError, e: if hasattr(e, 'reason'): print u"连接糗事百科失败,错误原因", e.reason return None #传入某一页代码,返回本页不带图片的段子列表 def getPageItems(self, pageIndex): pageCode = self.getPage(pageIndex) if not pageCode: print u'页面加载失败...' return None #开始正则匹配 reg = '<div.*?class="article block.*?>.*?<h2>(.*?)</h2>.*?<div.*?class="articleGender.*?">(.*?)</div>.*?<div.*?class="content">.*?<span>(.*?)</span>.*?<span.*?class="stats-vote".*?<i.*?class="number">(.*?)</i>.*?</span>.*?<a.*?class="qiushi_comments".*?>.*?<div.*?class="single-clear".*?>.*?</div>.*?</div>' pattern = re.compile(reg, re.S) items = re.findall(pattern, pageCode) #用来存储每页的段子们 pageStories = [] #遍历正则表达式匹配的信息 file = open('connect.txt', 'a+') for item in items: item = list(item) for i in range(len(item)): item[i] = item[i].strip() #过滤内容,是否含有图片 if i == 2: haveImg = re.search('img', item[2]) if not haveImg: #过滤换行 replaceBr = re.compile('<br/>') item[2] = re.sub(replaceBr, "\n", item[2]) pageStories.append(item) # print pageStories # break #写入到mysql数据库中 self.insertMysql(item) #处理字符串编码问题 ,再写入到文件 item = str(item).decode('unicode-escape').replace('u', '') file.write(item + "\r\n") file.close() return pageStories #加载并提取页面的内容,加入到列表中 def loadPage(self): pageStories = self.getPageItems(self.pageIndex) #如果当前未看的页数少于2页,则加载新一页 if self.enable == True: if len(self.stories) < 2: #获取新一页 pageStories = self.getPageItems(self.pageIndex) #将该页的段子存放到全局list中 if pageStories: self.stories.append(pageStories) #获取完之后页面索引加一,表示下次读取下一页 self.pageIndex += 1 #调用该方法,每次敲回车打印输出一个段子 def getOneStory(self, pageStories, page): #遍历一页的段子 for story in pageStories: print len(story) # return 123 #等待用户输入 input = raw_input("请按Enter查看下一条:".decode('utf-8').encode('gbk')) #每当输入回车一次,判断一下是否要加载新页面 self.loadPage() #如果输入Q则程序结束 if input == 'Q': self.enable = False return print u"第%d页\t发布人:%s\t发布人年龄:%s\t赞:%s\n段子内容:%s" %(page,story[0],story[1],story[3],story[2]) #把爬取的内容写入到数据库中 def insertMysql(self, data): db = MySQLdb.connect("127.0.0.1", "root", "root", "python2.7", charset='utf8') cursor = db.cursor() sql = "INSERT INTO example_01(age, name, comment, content) VALUES('%s', '%s', '%s', '%s')" % (int(data[1]), str(data[0]), int(data[3]), str(data[2])) # print str(data[2]) try: cursor.execute(sql) db.commit() except: db.rollback() db.close() #开始方法 def start(self): print u"正在读取糗事百科,按回车查看新段子,Q退出" #使变量为True,程序可以正常运行 self.enable = True #先加载一页内容 self.loadPage() #局部变量,控制当前读到第几页 nowPage = 0 while self.enable: if len(self.stories) > 0: #从全局list中获取一页段子 pageStories = self.stories[0] #当前读到的页数加1 nowPage += 1 #将全局list中第一个元素删除,因为已经取出 del self.stories[0] #输出该页的段子 self.getOneStory(pageStories, nowPage) splider = Reptile() splider.start() ```