HappyCoding:] ChildhoodAndy

思维世界的发展,在某种意义上说,就是对惊奇的不断摆脱。——爱因斯坦

Python之数据采集google搜索联想词

| Comments

这是一个我在业余时间学习python的一个小练习,纯属新手,有不对的地方,还恳朋友们留言指出。

1. Google搜索

当我们在google搜索引擎中输入关键字的时候,会实时弹出一些联想提示短语的列表。这篇文章想通过python做这样一个数据采集的工作。我们使用 Chrome 浏览器来分析下。(Google服务被GFW禁掉,我采用了VPN。)

第一步【输入关键字】

第二步【Chrome浏览器开发者工具打开网络标签查看】

第三步【查看返回Preview/Response】

2. 代码思路 Github

这里随便选择了三个关键字,分别是lovelikehate

Python之数据采集google搜索联想词
# A demo to show how to collect the suggestion words when we search with search engine 


import urllib
import urllib2
import re
import time
from random import choice

wordsSearchingList = ['love', 'like', 'hate']

for item in wordsSearchingList:
    keyWord = urllib.quote(item)

    url = 'https://www.google.co.jp/complete/search?client=hp&hl=zh-CN&gs_rn=48&gs_ri=hp&tok=9rRotU-cEDUkHKHgOoZAZw&cp=4&gs_id=je&q=%s&xhr=t' % (keyWord)
# 填写Request Headers,防止被ban掉

    headers = {
        "GET": url,
        "Host": "www.google.co.jp",
        "Referer": "https://www.google.co.jp/",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36",
    }

    req = urllib2.Request(url)

    for key in headers:
        req.add_header(key, headers[key])

    html = urllib2.urlopen(req).read()

# 正则匹配

    pattern = re.compile(r'"({searchWord}.*?)"'.format(searchWord = keyWord))
    results = pattern.findall(html)
    for item in results:
        print item
    time.sleep(1)
    print '-------------------------------------'
输出结果
love
love tv show
love
love story
love the way you lie
love is an open door
love moschino
love never felt so good
loveq
love live 第二季
love actually
-------------------------------------
like
likert scale
likelihood ratio test
-------------------------------------
hate
hater snapback
hater帽子
hateoas
hater snapback uk
hate crime
hate speech
hateship loveship
haters gonna hate
hate什么意思
hater uk
-------------------------------------
[Finished in 5.0s]

3. 存在问题

正则匹配我用的是pattern = re.compile(r'"({searchWord}.*?)"'.format(searchWord = keyWord)),会匹配出类似"love story""love live 第二季"这样以love开头,并被双引号包围的短语。但这样会导致下面这个问题:

like 的联想词中其实是有中文联想的,但由于该正则表达式的问题,只显示了英文。

这个仍然有待改进。

Comments

comments powered by Disqus