互动百科词条快速抓取[适用于文本处理与挖掘]

  • 1.前言   

  因近期小组的一个项目有文本挖掘的需求,需要用到Word2Vec的文本特征抽取,为了进行技术预演需要我们提前对模型进行训练。而只要涉及数据挖掘相关的模型,数据集是不必可少的。中文文本挖掘领域,百科词条涵盖面广,而且内容比较丰富,于是便选择百科的词条作为数据集 (http://baike.com)。

 

  • 2.词条抓取方案与代码实现

 

  2.1 抓取方案

  step1:

    收集百科词条种子(后台的id列表)

  step2:

    获取详情页并解析html中的词条正文

  step3:

    数据保存(以文本txt保存或者存库)

 

  a)如何获取加载列表的js请求地址和请求参数格式?

打开Chrome浏览器之后,键盘上按“F12”进入调试界面

 

  b)如从词条详情页获取正文的css样式 ?

  

  2.2 代码实现 

  step1:收集词条id列表并保存到redis

 1 def fetch_seeds():
 2     print "-- fetch seeds --"
 3     cnt = 0
 4     for def_index in range(4, 10):
 5         ret = do_run(index=def_index)
 6         cnt += ret
 7     print("cnt =  %d" % cnt)
 8 
 9 def do_run(index, page_num=100):
10     artical_list = []
11     for pn in range(1, page_num + 1):
12         try:
13             url = 'http://api.hudong.com/flushjiemi.do?flag=2&topic=%d&page=%d&type=2' % (index, pn)
14             retText = fetch(url)
15             print("ret = %s" % retText)
16             ret_json = json.loads(retText, encoding='utf-8')
17             result = ret_json["result"]
18             if len(result) > 0:
19                 for ob in result:
20                     # artical_list.append(ob["article_topic_name"])
21                     # artical_list.append("%s%s%s" % (ob["article_topic_name"], "-", ob["article_id"]))
22                     artical_list.append(ob["article_id"])
23                 save2redis(index, artical_list)
24             # sleep
25             if pn % 5 == 0:
26                 print 'pn=%d, sleeping...' % pn
27                 time.sleep(1)
28         except:
29             print "http get or parse error!"
30 
31     return 1
32 
33 def save2redis(index, article_list):
34     r = redis.Redis(host=redis_db_host, port=redis_db_port, db=redis_db_index)
35     for article in article_list:
36         r.sadd("%s-%d" % ("news.set", index), article)

 

 

  step2:抓取词条详情并保存到redis

 1 def fetch_detail():
 2     print "-- fetch detail --"
 3     r = redis.Redis(host=redis_db_host, port=redis_db_port, db=redis_db_index)
 4     cnt = 0
 5     for news_index in range(4, 10):
 6         seeds = r.smembers("%s-%s" % ("news.set", news_index))
 7         if len(seeds) > 0:
 8             for seed in seeds:
 9                 try:
10                     ret = crawl(seed)
11                     cnt += 1
12                     if cnt % 10 == 0:
13                         time.sleep(2)
14                         print 'cnt=%d, sleeping...' % cnt
15                     # save to redis
16                     save_detail(seed, result=ret)
17                     # break  # unit test
18                 except:
19                     print "fetch detail error!!!"
20     pass
21 
22 def crawl(page_no):
23     url = 'http://jiemi.baike.com/pa/detail?id=%s&type=1' % page_no
24     print "url=", url
25     content = fetch(url)
26     soup = BeautifulSoup(content, "html.parser")
27     return fetch_with_class(soup, class_type="jiemi-content")
28     
29 def save_detail(seed, result=""):
30     r = redis.Redis(host=redis_db_host, port=redis_db_port, db=redis_db_index_2)
31     r.set("id_%s" % seed, result)
32     return 1

 

  1)环境说明 python2.7, redis4.x  

  2)github项目完整源码 https://github.com/SeaSky0606/baike-crawler

  3)为维护网络和谐,词条数据仅适用于研究与学习,请勿恶意抓取。

转载于:https://www.cnblogs.com/SeaSky0606/p/10083962.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
百度百科约500万条词条,可用于语义关联或简单的知识网络建立,xml格式,解压后638M,请不要用记事本直接打开,我是用UE打开的,sublime好像会有乱码,文件内容示例如下: =1 <TITLE>=百度百科 =百度,百度百科,网络,百科全书,百科词典 =百度知道;贴吧;百度空间;百度地图;百度新闻搜索;百度图片;百度mp3;百度Hi;百度工具栏;百度影视;百度邮编搜索;百度黄页搜索;百度杀毒;百度语音搜索;科利尔百科全书;苏联大百科全书;汇吃百科;维基百科;百度视频;百度蜘蛛;百度文库;互动百科;百度文档;百度文化共享搜索;百度盲道;百度会员;百度搜藏;百度TV;百科全书;知识掌门人;百度游戏;百度有啊;张震;科友; =http://baike.baidu.com/view/1.htm =2 <TITLE>=词条 =百度,百度百科 =相关词条; =http://baike.baidu.com/view/2.htm =3 <TITLE>=编辑实验 =百度,百度百科,帮助,词条,编辑 =词条;百度; =http://baike.baidu.com/view/3.htm =4 <TITLE>=馒头 =食品,饮食,面食,食谱,蒸馍 =大饼;油条;面包;饺子;花卷;包子;麻花;食品;主食;糯米饭;蛋糕;鲜肉包;米粥;面条;凉拌菜;年糕;饼干;窝头;粽子;烤饼;酥饼;汤圆;烧饼; =http://baike.baidu.com/view/4.htm =6 <TITLE>=雁荡山 =地理,旅游,旅游景点,自然景观,地质公园 =华山;泰山;普陀山;恒山;嵩山;莫干山;浣江;衡山;括苍山;双龙洞;雪窦山;天台山;天目山;楠溪江;天柱山;景宁香炉山;乌镇;杭州西湖;泽雅;白水洋;武夷山;洞宫山;桃花岛;三清山;黄山;新安江水库;崂山区;溪口;太姥山;南麂列岛;野鹤湫;庐山;江心屿;瑶溪;朱家尖;石桅岩;绍兴县;杨家溪;仙岩山;仙都风景区;大龙湫;三折瀑;五岳; =http://baike.baidu.com/view/6.htm =7 <TITLE>=灵峰 =风景,雁荡山,地理,旅游,温州 = =http://baike.baidu.com/view/7.htm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值