“搜狗问问”问答语料爬虫

    本人的毕业设计是构建一个基于机器学习的问答系统,需要用到大量的问题答案对,并且每个问题下都应有相应的分类标签。

    鉴于网络上有分类标签的问答语料很少被人公开,本人亲自编写爬虫来抓取语料。

    中文的问答网站有:百度知道、知乎、悟空问答、奇虎问答、搜狗问问等,通过筛选,最后我锁定“搜狗问问”网站。原因是:

  1. 不具备反爬虫机制或者说连最基本的频繁次数限制都没有。
  2. 每个问题都有一个大标签和多个小标签。
  3. URL的结构分明

          

爬虫使用基于树的层次遍历算法:

      


使用Python编写,代码如下:

#coding:utf-8

import urllib2
import re
from bs4 import BeautifulSoup
import codecs
import sys
import json

stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr 
reload(sys)
sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde 
sys.setdefaultencoding('utf-8')

'''
从搜狗问问爬取每个分类标签下的问题答案集,每个问题追加为json格式:
{
    "answer": [
        "我一直用的是云末感觉还是挺稳定的。"
    ],
    "tag": {
        "75023": "英雄联盟"
    },
    "question": "网易uu加速器加速lol怎么样",
    "hasAnswer": true
}
'''
global rootUrl
#加载页面内容
def LoadPage(url):
    try:
        user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0  "
        headers = {"User-Agent" : user_agent}
        request = urllib2.Request(url,headers = headers)
        response = urllib2.urlopen(request)
        html = response.read()
        allTitles = []
        allTitles = GetTitle(html)
        if allTitles:
           QuestionAnswers = []
           QuestionAnswers = GetQuestionAnswers(allTitles)
           if QuestionAnswers:
               return QuestionAnswers
    except Exception,e:
        print str(e)


#获取问题标题
def GetTitle(html):
    allTitles = []
    myAttrs={'class':'sort-lst-tab'}
    bs = BeautifulSoup(html)
    titles = bs.find_all(name='a',attrs=myAttrs)
    for titleInfo in titles:
        item = {}
        titleInfoStr = str(titleInfo)
        questionInfo = re.findall(r'sort-tit">(.*?)</p>',titleInfoStr,re.S)
        question = questionInfo[0]
        answerInfo = re.findall(r'sort-rgt-txt">(.*?)</span>',titleInfoStr,re.S)
        if u'0个回答' in answerInfo:
            item['hasAnswer'] = False
        else:
            item['hasAnswer'] = True
        tags = re.findall(r'sort-tag" data-id=(.*?)/span>',titleInfoStr,re.S)
        tagInfo = {}
        for tag in tags:
            tagId = re.findall(r'"(.*?)">',tag,re.S)
            tagName = re.findall(r'>(.*?)<',tag,re.S)
            tagInfo[tagId[0]] = tagName[0]
            if tagId not in smalltags.keys():
                smalltags[tagId[0]] = tagName[0]
        subUrl = re.findall(r'href="(.*?)"',titleInfoStr,re.S)            
        url = rootUrl + subUrl[0]
        item['url'] = url
        item['question'] = question
        item['tag'] = tagInfo
        allTitles.append(item)
    return allTitles
        

#获取问题和答案
def GetQuestionAnswers(allTitles):
    QuestionAnswers = []
    for item in allTitles:
        QuestionAnswer = {}
        if item['hasAnswer']: 
            Answers = []
            url = item['url']
            try:
                user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0  "
                headers = {"User-Agent" : user_agent}
                request = urllib2.Request(url,headers = headers)
                response = urllib2.urlopen(request)
                html = response.read()
                questionAttrs={'id':'question_title_val'}
                answerAttrs={'class':'replay-info-txt answer_con'}
                bs = BeautifulSoup(html)
                #questions = bs.find_all(name='span',attrs=questionAttrs)            
                questions = re.findall(r'question_title_val">(.*?)</span>',html,re.S)
                question = questions[0]
                answers = bs.find_all(name='pre',attrs=answerAttrs)
                if answers:
                    for answer in answers:
                        answerStr = ''
                        if "<p>" in str(answer):
                            segements = re.findall(r'<p>(.*?)</p>',str(answer),re.S)
                            for seg in segements:
                                answerStr = answerStr + str(seg)
                            if answerStr.strip() != "":
                                Answers.append(answerStr.strip())
                        else:
                            noPanswer = re.findall(r'answer_con">(.*?)</pre>',str(answer),re.S)
                            Answers.append(noPanswer[0])
                    QuestionAnswer['answer'] = Answers
                QuestionAnswer['question'] = question            
                QuestionAnswer['tag'] = item['tag']
                QuestionAnswer['hasAnswer'] = True
            except Exception,e:
                print str(e)
        else:
            QuestionAnswer['question'] = item['question']
            QuestionAnswer['tag'] = item['tag']
            QuestionAnswer['answer'] = ''
            QuestionAnswer['hasAnswer'] = False
        QuestionAnswers.append(QuestionAnswer)
    return QuestionAnswers

#if __name__ == '__main__':
baseurl = "https://wenwen.sogou.com/cate/tag?"
rootUrl = 'https://wenwen.sogou.com'
#问题分类标签
tagids = ['101','146','111','163614','50000010','121','93474','9996','148','50000032','135','125','9990','465873']
global smalltags
smalltags = {}
#遍历标签
for tagid in tagids:
    f = codecs.open('../../../origin_data/wenwen_corpus/QuestionAnswers/'+str(tagid)+'/test.json','a',encoding='utf-8')
    t = codecs.open('../../../origin_data/wenwen_corpus/QuestionAnswers/'+ str(tagid) +'/smalltag.json','a',encoding="utf-8")
    #每个标签拉n个页面
    print u'标签:',tagid
    for i in range(5000,0,-1):
        tag = 'tag_id='+ tagid
        tp = '&tp=0'
        pno = '&pno='+str(i)
        ch = '&ch=ww.fly.fy'+str(i+1)+'#questionList'
        url = baseurl + tag + tp + tp + pno + ch
        print url
        QuestionAnswers = []
        QuestionAnswers = LoadPage(url)
        if QuestionAnswers:
            for qa in QuestionAnswers:
                jsonStr = json.dumps(qa,ensure_ascii=False)
                f.write(jsonStr.encode("utf-8")+'\n')
    #保存tag
    json.dump(smalltags,t,ensure_ascii=False)
    t.close()
    f.close()


爬取的数据格式:


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 搜狗新闻语料库json是搜狗公司提供的一个包含丰富新闻内容的数据集,以json格式存储。该数据集包含了大量的新闻文本信息,可以用于新闻相关的研究和应用开发。使用json格式存储的好处是可以方便地对数据进行读取和解析。 这个数据集可以用于多种研究领域,比如自然语言处理、文本挖掘和机器学习等。对于自然语言处理的任务,可以利用这个数据集进行新闻文本的分类、情感分析、关键词提取等。同时,通过对这个数据集进行深度学习模型的训练,还可以实现文本生成、机器翻译等更复杂的任务。 对于应用开发来说,搜狗新闻语料库json可以用于构建新闻推荐系统,根据用户的兴趣和偏好,推荐他们感兴趣的新闻内容。同时,也可以利用这个数据集进行热点事件的监测和分析,通过对大量新闻文本的处理,挖掘出当前社会上的热门话题和关键事件。 总之,搜狗新闻语料库json是一个宝贵的资源,可以为新闻相关研究和应用开发提供丰富的数据支持。通过合理的利用这个数据集,可以开展多种研究和应用项目,为推动相关领域的发展做出贡献。 ### 回答2: 搜狗新闻语料库json是指搜狗公司提供的新闻语料数据集,以json格式进行存储和交互。该数据集包含大量新闻文本,以及与每篇新闻相关的元数据信息。 通过使用搜狗新闻语料库json,用户可以获取到丰富的新闻信息。每篇新闻文本都包含了标题、内容、时间、来源等元数据信息,方便用户对新闻进行分类、分析和挖掘。例如,可以利用该数据集进行新闻文本分类任务,根据文本内容和元数据信息对新闻进行分类,如体育新闻、娱乐新闻、财经新闻等,从而更好地理解和获取特定领域的新闻。 此外,搜狗新闻语料库json也可以用于新闻文本的情感分析。用户可以从文本内容中提取情感词汇,并结合元数据信息进行情感分析,了解新闻背后的情感倾向、态度和观点。这对于企业和机构来说尤为重要,可以根据新闻情感分析结果来调整营销战略、舆情管理和产品服务。 总之,搜狗新闻语料库json是一个丰富的新闻数据集,可以用于各种文本分析任务,如文本分类、情感分析等。通过利用该数据集,用户可以更好地了解和分析新闻文本,从而为企业和个人的决策提供更全面和准确的信息支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值