发现更大的SEO世界
 找回密码
 注册

扫一扫,访问微社区

搜索
»首页»SEO培训 SEO论坛 SEO交流 帖子
12下一页
发新帖
刀心,前来膜拜各位大神    

Python挖词脚本,挖出几十万关键词不是梦 带搜索量

本帖最后由 刀心 于 2015-6-26 17:43 编辑

前段时间在@方法的博客上看到一个数据接口,貌似是百度商情的关键词数据。
方法博客中用的是ssh,几行代码就搞定了挖词,但是我试了一下,挖出来有一些错乱也有一些重复。于是就用python做了一个版本。拿出来分享一下。
方法的原文:http://seofangfa.com/shell/baidukeyword-shangqing.html

在运行脚本之前,请确定你是否按照了MySQLdb库,安装方法可以去百度一下。

下面是我的代码。
  1. #!/usr/local/bin/python
  2. #coding:utf8
  3. # 2015-6-26 DaoXin
  4. import pycurl, json, MySQLdb
  5. import StringIO
  6. import urllib, urllib2
  7. from random import choice
  8. import sys
  9. reload(sys)
  10. sys.setdefaultencoding('utf8')
  11. #useragent 列表,大家可以自行去收集。不过在本例中似乎不需要这个
  12. AGENTS = [
  13.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36",
  14.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
  15.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
  16.             "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
  17.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
  18.             "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b4pre) Gecko/20100815 Minefield/4.0b4pre",
  19.             "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5",
  20.             "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.17) Gecko/20110123 (like Firefox/3.x) SeaMonkey/2.0.12",
  21.             "Mozilla/5.0 (Windows NT 5.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1",
  22.             "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-CN) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.302.2 Safari/532.8",
  23.             "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; zh-CN) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.464.0 Safari/534.3",
  24.             "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; zh-CN) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13",
  25.             "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1",
  26.             "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8",
  27.             "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.5 (KHTML, like Gecko) Safari/312.3",
  28.             "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3",
  29.             "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Camino/2.2.1",
  30.             "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre Camino/2.2a1pre",
  31.             "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
  32.             "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML like Gecko) Chrome/22.0.1229.79 Safari/537.4",
  33.             "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1",
  34.             "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20120813 Firefox/16.0",
  35.             "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-CN) AppleWebKit/528.16 (KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0.112941",
  36.             "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; zh-CN) AppleWebKit/528.16 (KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0",
  37. ]

  38. UserAgent = choice(AGENTS)


  39. #如果需要把挖出来的关键词保存到数据库,需要配置数据库相关信息
  40. class ConnDb():
  41.     global host, user, passwd, db
  42.     host = '111.111.111.111' #数据库IP
  43.     user = 'python' #数据库用户名
  44.     passwd = 'python' #数据库密码
  45.     db = 'testdb' # 数据库名
  46.     def connDb(self):
  47.         global cur
  48.         conn = MySQLdb.connect(host=host, user=user, passwd=passwd, db=db, port=3306, charset = 'utf8')
  49.         cur = conn.cursor()
  50.         return cur

  51. # 这个curl方法是从@zero那里扒过来的。http://www.seoqx.com/post/341
  52. def curl(url, debug=False, **kwargs):
  53.     while 1:
  54.         try:
  55.             s = StringIO.StringIO()
  56.             c = pycurl.Curl()
  57.             c.setopt(pycurl.URL, url)
  58.             c.setopt(pycurl.REFERER, url)
  59.             c.setopt(pycurl.FOLLOWLOCATION, True)
  60.             c.setopt(pycurl.TIMEOUT, 60)
  61.             c.setopt(pycurl.ENCODING, 'gzip')
  62.             c.setopt(pycurl.USERAGENT, UserAgent)
  63.             c.setopt(pycurl.NOSIGNAL, True)
  64.             c.setopt(pycurl.WRITEFUNCTION, s.write)
  65.             for k, v in kwargs.iteritems():
  66.                     c.setopt(vars(pycurl)[k], v)
  67.             c.perform()
  68.             c.close()
  69.             return s.getvalue()
  70.         except:
  71.             if debug:
  72.                     raise
  73.             continue

  74. command = int(raw_input("请选择导出形式;1:导出为txt,2:导入道数据库: "))

  75. if command == 1:
  76.         FileWrite = open("output.txt", 'w')
  77.         for line in open('sourceword.txt'):
  78.                 kw = str(line)
  79.                 jsons = curl('http://honeyimg.bdimg.com/recomword/recomWordCache_findRecomWord.htm?area_id=&word=' + urllib.quote_plus(kw))
  80.                 d = json.loads(jsons)
  81.                 try:
  82.                         dlist = d['data']['list']
  83.                         for item in dlist:
  84.                                 indexs = item['total']
  85.                                 keywords = item['word'].encode('utf-8')
  86.                                 outstr = str(indexs) + ',' + str(keywords) + '\n'
  87.                                 FileWrite.write(outstr)
  88.                 except TypeError, e:
  89.                         print 'TypeError, Pass', e
  90.                         continue
  91.         print 'done to txt'
  92. elif command == 2:
  93.         conndb = ConnDb()
  94.         conndb.connDb()
  95.         for line in open('sourceword.txt'):
  96.                 kw = str(line)
  97.                 jsons = curl('http://honeyimg.bdimg.com/recomword/recomWordCache_findRecomWord.htm?area_id=&word=' + urllib.quote_plus(kw))
  98.                 d = json.loads(jsons)
  99.                 try:
  100.                         dlist = d['data']['list']
  101.                         for item in dlist:
  102.                                 indexs = item['total']
  103.                                 #keywords = unicode(item['word'], 'utf-8')
  104.                                 keywords = item['word'].encode("utf-8")
  105.                                 sql = "insert into shangqing_keyword (id, total, keyword) values (null, '%s', '%s')"
  106.                                 try:
  107.                                         cur.execute(sql % (indexs, keywords))
  108.                                 except MySQLdb.Error, e:
  109.                                         print 'MySql error', e
  110.                                         continue
  111.                 except TypeError, e:
  112.                         print 'TypeError, Pass' , e
  113.                         continue
  114.         print 'done to mysql'
  115. else:
  116.         print '只有两种导出方式,请输入1或者2'

复制代码


使用方法:

1、将你的词根放到sourceword.txt 中,一行一个词,然后将本文代码随便保存成一个xxxx.py  和sourceword.txt 放在同一个目录下。
2、交互模式下,进入这两个文件所在目录,运行脚本xxx.py(一般是输入python xxx.py即可)
3、会有提示选择导出模式,1为导出txt文件,2为导入到mysql中。如下图

QQ20150626-4@2x.jpg
图中的typeerror请忽略。

如果需要导入到mysql中,请配置mysql的相关信息,在代码中有注释。
不过首先需要在你的数据库中创建一个表,语句如下:
  1. CREATE TABLE `shangqing_keyword` (
  2.   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  3.   `keyword` varchar(200) DEFAULT NULL,
  4.   `total` int(11) DEFAULT NULL,
  5.   PRIMARY KEY (`id`),
  6.   UNIQUE KEY `keyword` (`keyword`)
  7. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
复制代码


4、等待完成。
个人认为导入到mysql更好管理,txt比较好处理一些。

我的sourceword中有6000个词,挖出来差不多30多万我就停止了。应该能挖出来更多。
效果截图:
QQ20150626-3@2x.jpg
这个是导出为txt格式的样子。

QQ20150626-5@2x.jpg
导入到mysql是这样的。还是mysql用起来顺手一些。个人喜好。

注意:导出txt格式是存在重复词的,因为我不知道怎么去过滤。但是导入到mysql中 重复词是会自动过滤掉的。不过反正都无所谓,后期处理的时候大家总能找到办法的。

如果使用有什么问题,欢迎交流。




评分

参与人数 4赞同 +4 收起 理由
am007 + 1 很给力!
kilito + 1 赞一个!
方法 + 1 很给力!
者一 + 1 很给力!

查看全部评分

发表于 2015-6-26 15:12:01
回复 收藏
刀心,前来膜拜各位大神    

本帖最后由 刀心 于 2015-7-1 16:45 编辑

沙发先占用。可能会有补充。

补充1:我不知道total出来的数字是指数还是搜索量。(不过已经确定这个数值不准确,不管是指数还是搜索量)
补充2:貌似sourceword.txt必须是utf-8格式,不然读到的是乱码
补充3:导入mysql可能会出现 mysql server has gone away的错误,网上查了一下貌似是连续读写mysql造成的,需要修改mysql的一些默认配置。
 楼主| 发表于 2015-6-26 15:31:22
回复 收藏
方法,SEO狂热爱好者、折腾派    

赞!shell还是弱了点,效率相对比较低,干这活儿还是得用专业的python类的程序来搞。。。。。
发表于 2015-6-26 15:57:14
回复 收藏
bobo1732,没天分,剩天真    

这个接口,估计很快就要IP频率限制了,不知道下载百度SERP页,有没有接口。。
发表于 2015-6-26 16:14:22
回复 收藏
刀心,前来膜拜各位大神    

方法 发表于 2015-6-26 15:57
赞!shell还是弱了点,效率相对比较低,干这活儿还是得用专业的python类的程序来搞。。。。。 ...

快快快  给分给分
 楼主| 发表于 2015-6-26 16:16:28
回复 收藏
刀心,前来膜拜各位大神    

bobo1732 发表于 2015-6-26 16:14
这个接口,估计很快就要IP频率限制了,不知道下载百度SERP页,有没有接口。。 ...

目前还没有被限制。 下载SERP页是什么意思。直接请求下载不行吗。。不会有这种接口吧。。
 楼主| 发表于 2015-6-26 16:17:55
回复 收藏
bobo1732,没天分,剩天真    

刀心 发表于 2015-6-26 16:17
目前还没有被限制。 下载SERP页是什么意思。直接请求下载不行吗。。不会有这种接口吧。。 ...

查询关键词不是要下载百度搜索结果页面么,下载太1000+个就下载不了了,。。。
发表于 2015-6-26 16:38:11
回复 收藏
刀心,前来膜拜各位大神    

bobo1732 发表于 2015-6-26 16:38
查询关键词不是要下载百度搜索结果页面么,下载太1000+个就下载不了了,。。。 ...

用代理IP呢。这个我没有尝试过。
 楼主| 发表于 2015-6-26 16:44:25
回复 收藏
bobo1732,没天分,剩天真    

刀心 发表于 2015-6-26 16:44
用代理IP呢。这个我没有尝试过。

唯有如此了。。
发表于 2015-6-26 17:11:29
回复 收藏
kilito,请到个人资料页面设置个人签名    

你将挖出来的词和指数构成元祖,然后append到列表里面,然后按指数从低到高排序(不过得确保指数的类型是整形,不然是排不到正确顺序的),排序之后就写进字典里面,因为排序之后,指数高的都在后面嘛,假入key相同的情况下,新添加的key会替旧有的key,所以利用这一点就能去重,而且还保留高指数的那个,然后将新字典用dict.iteritems()再排一下序输出,就可以了。菜鸟一名,所以用这种比较麻烦的方法,如果你想到更好的,请指点一下哦。
ps:有时候,通过商情挖出来的词里面带空格的,是不是去除空格后再挖会好一点?
发表于 2015-6-26 20:59:05
回复 收藏
刀心,前来膜拜各位大神    

kilito 发表于 2015-6-26 20:59
你将挖出来的词和指数构成元祖,然后append到列表里面,然后按指数从低到高排序(不过得确保指数的类型是整 ...

用mysql维护的话可以把字段设置成UNIQUE,导入的时候就不会导入重复的词了。我是这么处理的。
带有空格和不带空格,我理解成它是两个词。
 楼主| 发表于 2015-6-27 00:04:44
回复 收藏
kilito,请到个人资料页面设置个人签名    

刀心 发表于 2015-6-27 00:04
用mysql维护的话可以把字段设置成UNIQUE,导入的时候就不会导入重复的词了。我是这么处理的。
带有空格和 ...

哦哦,好的
发表于 2015-6-27 08:29:08
回复 收藏
alexkh,积累金币~    

之前了解过这个接口,搜索量还不是真实搜索数据,只能做参考。
可以看下中山陵的数据,里面搜索量是0,明显不符合逻辑的。
发表于 2015-6-29 12:34:08
回复 收藏
刀心,前来膜拜各位大神    

alexkh 发表于 2015-6-29 12:34
之前了解过这个接口,搜索量还不是真实搜索数据,只能做参考。
可以看下中山陵的数据,里面搜索量是0,明显 ...

恩  确实存在。你那边有接触过其他类似的接口吗。可以私聊不
 楼主| 发表于 2015-6-29 13:19:07
回复 收藏
姜姜,个人比较闲,学习python中    

kilito 发表于 2015-6-26 20:59
你将挖出来的词和指数构成元祖,然后append到列表里面,然后按指数从低到高排序(不过得确保指数的类型是整 ...

用set就行了

评分

参与人数 1赞同 +1 收起 理由
刀心 + 1 赞一个! 把你的代码也贴出来呗.

查看全部评分

发表于 2015-6-30 10:48:36
回复 收藏
12下一页
快速回复 返回顶部 返回列表