0%

百度指数爬取

程序设计需求:横向对比中国各城市对于各关键词百度搜索强度。

  本程序基于网友longxiaofei设计的百度指数访问python包,链接如下:https://github.com/longxiaofei/spider-BaiduIndex。

爬虫需要获取百度指数网站cookie,在百度指数官网打开开发者模式即可取得。
  爬虫核心函数代码如下,程序链接会在文末贴出。

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 获取百度指数的函数  
def get_baidu_index(keywords_list: List[List[str]], citycode, cookiesQueue):

# cookie
cookies = cookiesQueue.queue[0]

# 当前请求的五个关键词
requested_keywords = []

# 一组(五个)关键词为元素的队列
q_keywords = queue.Queue(-1)

# 将keywordlist分组后置入队列q_keywords
for splited_keywords_list in split_keywords(keywords_list):
q_keywords.put(splited_keywords_list)

# 当次请求的城市名称
cityname = str(CITY_MAP[str(citycode)])

print("开始请求"+str(CITY_MAP[str(citycode)])+"的百度指数")

# 遍历q_keywords,每一组q_keywords请求一次
# 获得的数据输入data
datas = []
while not q_keywords.empty():

# 取出一组
cur_keywords_list = q_keywords.get()

# 增加容错率:若错误,则换cookie重试
# 当前尝试次数
attempts = 0
# 最大尝试次数
max_attempts = 3

while attempts < max_attempts:
try:
print(f"开始请求: {cur_keywords_list}")
# 这一组获得的data
current_data = []
for index in get_search_index(
keywords_list=cur_keywords_list,
start_date=STARTTIME,
end_date=ENDTIME,
cookies=cookies,
area=citycode
):
index["keyword"] = ",".join(index["keyword"])
# 将输出的index数据转化为list
index_list = [citycode, cityname, index['keyword'], index['type'], index['date'], index['index']]
current_data.append(index_list)
requested_keywords.extend(cur_keywords_list)
print(f"请求完成: {cur_keywords_list}")
datas.extend(current_data)
time.sleep(0.2)
break

except Exception as e:
traceback.print_exc()
print(f"请求出错, requested_keywords: {requested_keywords},错误为{e}")
time.sleep(5)
cookies = cookiesQueue.get()
attempts += 1

return datas

  本程序包含三个文件夹与一个主程序(.py),其中参考数据文件夹给出了百度指数对于中国355个城市给出的代码以及相应的城市名称,输出数据文件夹存储爬取的数据,而输入数据的文件夹包含存储百度cookies文本文件Allcookies,每行存放一个cookie,注意行末不要出现换行符。由于百度指数对于每个cookie访问的次数存在限制(几天后会刷新),因此对于关键词较多的爬取要求,建议多准备几个cookie。Ocity数据中存放城市代码与城市名称,Keyword中存放关键词(第一列存放排序数字)。总之,按示例数据填充即可。
代码链接如下:
链接