zoukankan      html  css  js  c++  java
  • Python爬虫爬取糗事百科段子内容

    参照网上的教程再做修改,抓取糗事百科段子(去除图片),详情见下面源码:

    #coding=utf-8
    #!/usr/bin/python
    import urllib
    import urllib2
    import re
    import thread
    import time
    import sys

    #定义要抓取的网页
    #url = 'http://www.qiushibaike.com/hot/'
    #读取要抓取的网页
    #globalcontent = urllib.urlopen(url).read()
    #抓取段子内容
    #new_inner01_h = globalcontent.find('<div class="content" <span>')
    #print new_inner01_h
    #设置系统编码utf-8
    reload(sys)
    sys.setdefaultencoding("utf-8")

    #加载处理糗事百科
    class Spider_Model:
    """docstring for Spider_Model"""
    def __init__(self):
    self.page = 1
    self.pages = []
    self.enable = False

    #抓取该页面的所有段子,添加到列表中并且返回列表
    def GetPage(self,page):
    try:
    myUrl = "http://m.qiushibaike.com/hot/page/" + str(page)
    user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
    headers = {'User-Agent':user_agent}
    req = urllib2.Request(myUrl,headers = headers)
    myResponse = urllib2.urlopen(req)
    myPage = myResponse.read().decode('utf-8')
    return myPage
    #decode的作用将其他编码的字符串转换成Unicode编码

    except urllib2.URLError, e:
    if hasattr(e,"code"):
    print u"链接糗事百科失败,错误原因",e.code
    if hasattr(e,"reason"):
    print u"链接糗事百科失败,错误原因",e.reason
    return None

    #传入某一页代码,返回本页不带图片的段子列表
    def getPageItems(self,page):
    myPage = self.GetPage(page)
    if not myPage:
    print "页面加载失败..."
    return None
    #正则匹配需要获取的段子
    pattern = re.compile('<div.*?class="author.*?clearfix".*?>.*?<a.*?</a>.*?<a.*? title="(.*?)">.*?</a>.*?<div.*?class'+
    '="content".*?>.*?<span.*?>(.*?)</span>.*?</a>(.*?)<div.*?class="stats.*?>.*?<i.*?class="number">(.*?)</i>',re.S)
    # pattern = re.compile('.*?(.*?)(.*?).*?.*?(.*?).*?.*?.*?(.*?).*?.*?',re.S)
    #pattern = re.compile('(.*?)(.*?).*?', re.S)
    #pattern = re.compile(r'.*?<a.*?<a.*?(.*?).*?(.*?)<!.*?.*?(.*?)',re.S)
    items = re.findall(pattern,myPage)

    #用来存储每页的段子们
    pageStroies = []
    #遍历正则表达式匹配的信息
    for item in items:
    #判断是否包含图片
    haveImg = re.search("img",item[2])

    #如果不含有图片,把它加入list中
    if not haveImg:
    #item[0]是发布者,item[1]是内容,item[3]是点赞数

    if '<br/>' in item:
    new_item = re.sub(r'<br.*?>',' ',item)
    pageStroies.append([new_item[0].strip(),new_item[1].strip(),new_item[3].strip()])
    else:
    pageStroies.append([item[0].strip(),item[1].strip(),item[3].strip()])
    return pageStroies


    #找出所有class="content"的div标记
    #re.S是任意匹配模式,也就是.可以匹配换行符
    #myItems = re.find('<div.*?class="content">(.*?)</div>',unicodePage,re.S)
    #items = []
    #for item in myItems:
    #item[0]是div的标题
    #item[1]是div的内容
    #items.append([item[0].replace(" ",""),item[1].replace(" "),""])
    #items = item[0]
    #return items

    #加载并提取页面的内容,加入到列表中
    def LoadPage(self):
    #如果用户未输入quit则一直运行
    #while self.enable:
    if self.enable == True:
    #如果当前未看的页数小于2也,则加载新一页
    if len(self.pages) < 2:
    #获取新一页
    pageStroies = self.getPageItems(self.page)
    #将该页的段子存放到全局list中
    if pageStroies:
    self.pages.append(pageStroies)
    #获取完之后页面索引加一,表示下次读取下一页
    self.page += 1
    #try:
    # 获取新的页面中的段子
    #myPage = self.GetPage(str(self.page))
    #self.page += 1
    #self.pages.append(myPage)
    #except:
    #print '无法链接糗事百科'
    #else:
    #time.sleep(1)
    #调用该方法,每次敲回车打印输出一个段子
    def ShowPage(self,pageStroies,page):
    #遍历一页的段子
    for items in pageStroies:
    #等待用户输入
    input = raw_input()
    #每次输入回车,判断是否要加载新页面
    self.LoadPage()

    #输入输入Q则程序结束
    if input == "Q":
    self.enable = False
    return
    print u"第%d页 发布人:%s 发布内容:%s 赞:%s " %(page,items[0],items[1],items[2])


    def Start(self):
    print u"正在读取糗事百科,按回车见查看新段子,Q退出"
    #初始化变量为True,程序正常执行
    self.enable = True
    #先加载一页内容
    self.LoadPage()
    #局部变量,控制当前读到了第几页
    nowPage = 0
    while self.enable:
    if len(self.pages)>0:
    #从全局list中获取一页的段子
    pageStroies = self.pages[0]
    #当前读到的页数加一
    nowPage += 1
    #将全局list中第一个元素删除,因为已经取出
    del self.pages[0]
    #输出该页的段子
    self.ShowPage(pageStroies,nowPage)
    '''
    page = self.page

    #新建一个线程在后台加载段子存储
    thread.start_new_thread(self.LoadPage,())

    #加载处理糗事百科
    while self.enable:
    #如果self的page数组中存有元素
    if self.pages:
    nowPage = self.pages[0]
    del self.pages[0]
    self.ShowPage(nowPage,page)
    page += 1


    print u'请按下回车键浏览今日的糗事百科:'
    raw_input(' ')
    '''
    myModel = Spider_Model()
    myModel.Start()

  • 相关阅读:
    Tomcat设置编码格式utf8
    Tomcat控制台中文乱码解决办法
    LogBack.xml配置文件详解
    logback配置文件---logback.xml详解
    Spring Boot 2.0下配置Log4j2下的错误问题分析与解决
    logback介绍和配置详解
    logback在SpringBoot下出现no applicable action for [appender], current ElementPath is [[configuration][a
    springboot配置Log4j(将输出日志打印在控制台)
    lombok @Slf4j注解
    java之PropertyUtils
  • 原文地址:https://www.cnblogs.com/lebb1993/p/6080325.html
Copyright © 2011-2022 走看看