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

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

1. Google搜索

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

第一步【输入关键字】

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

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

2. 代码思路 Github

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

Python之数据采集google搜索联想词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 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 '-------------------------------------'
输出结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 的联想词中其实是有中文联想的,但由于该正则表达式的问题,只显示了英文。

这个仍然有待改进。

坚持原创技术分享,您的支持将鼓励我继续创作!