Wyl
2022/03/02阅读:181主题:山吹
爬虫 | 关键词百度指数数据获取
爬虫 | 关键词百度指数数据获取
引言
随着互联网的普及,特别是微信、微博、抖音等网络社交平台的完善,公众越来越倾向于通过互联网新媒体了解社会信息和实时热点,并且在社交平台表达自己的看法。近年来,国内外的一些学者在研究中开始使用互联网搜索指数构造指标度量公众对社会经济活动的需求和关注程度。在国内文献中,百度指数已经成为实证研究的热门数据来源
郑思齐等(2013,管理世界)
使用以“环境污染”为关键词的Google搜索指数度量公众环境诉求;李欣等(2017,经济学动态)
使用以“大气污染”为关键词的百度搜索网页数量作为公众对环境污染的关注度,并以此度量非正式环境规制的水平;唐松等(2019,金融研究)
使用以“污染”为关键词的省份百度指数来度量不同省份居民对环保需求的主观偏好;刘志峰和张婷婷(2020,管理科学学报)
使用与彩票相关关键词的百度指数作为投资者彩票偏好的代理变量,具体包括“彩票”、“福彩”、“双色球”、“体彩”、“大乐透”等5个关键词
可见,百度指数可以用来衡量地区内(省级和市级)公众对经济活动的偏好、需求、关注和监督程度,对于实证研究的独特变量构造大有裨益。
虽然我们可以手工收集年度-地区的某关键词相关的搜索指数,但是如此却费时费力。同时,现有网络平台上鲜有关于利用python爬取百度指数的代码教程。为此,本文主要介绍如何利用python爬虫技术批量获取百度指数,以降低研究学者的时间成本。
目标
以时间-地区-关键词
为输入,自动获取相应百度搜索指数的整体均值
-
地区:包括省级和市级 -
时间:2011年-2022年
基本思路
以2022年1月1日至2022年3月1日,俄乌战争
关键词,北京地区的百度搜索指数为例


我们需要获取的就是在该时间段该区域内关键词搜索指数的整体日均值
通过网页分析可以发现,整体日均值的数据在https://index.baidu.com/api/SearchApi/index?area=911&word[[%7B%22name%22:%22%E4%BF%84%E4%B9%8C%E6%88%98%E4%BA%89%22,%22wordType%22:1%7D]]&startDate=2022-01-01&endDate=2022-03-01
可以找到
area
是地区代码、word
是关键词、startDate
是开始时间、endDate
是结束时间、%22%E4%BF%84%E4%B9%8C%E6%88%98%E4%BA%89%22
是俄乌战争对应的码化信息

avg:369
即是我们想要抓取的数据
在此基础上,我们只需要循环地区代码和设置时间就可以批量获取关键词百度指数
代码实现
导入第三方库
import os
import random
import time
from time import sleep
import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import openpyxl
地区代码
PROVINCE_CODE = {'山东': '901', '贵州': '902', '江西': '903', '重庆': '904', '内蒙古': '905', '湖北': '906', '辽宁': '907', '湖南': '908', '福建': '909', '上海': '910', '北京': '911', '广西': '912', '广东': '913', '四川': '914', '云南': '915', '江苏': '916', '浙江': '917', '青海': '918', '宁夏': '919', '河北': '920', '黑龙江': '921', '吉林': '922', '天津': '923', '陕西': '924', '甘肃': '925', '新疆': '926', '河南': '927', '安徽': '928', '山西': '929', '海南': '930', '台湾': '931', '西藏': '932', '香港': '933', '澳门': '934'}
CITY_CODE = {'广州': '95', '深圳': '94', '东莞': '133', '云浮': '195', '佛山': '196', '湛江': '197', '江门': '198', '惠州': '199', '珠海': '200', '韶关': '201', '阳江': '202', '茂名': '203', '潮州': '204', '揭阳': '205', '中山': '207', '清远': '208', '肇庆': '209', '河源': '210', '梅州': '211', '汕头': '212', '汕尾': '213', '郑州': '168', '南阳': '262', '新乡': '263', '开封': '264', '焦作': '265', '平顶山': '266', '许昌': '268', '安阳': '370', '驻马店': '371', '信阳': '373', '鹤壁': '374', '周口': '375', '商丘': '376', '洛阳': '378', '漯河': '379', '濮阳': '380', '三门峡': '381', '济源': '667', '成都': '97', '宜宾': '96', '绵阳': '98', '广元': '99', '遂宁': '100', '巴中': '101', '内江': '102', '泸州': '103', '南充': '104', '德阳': '106', '乐山': '107', '广安': '108', '资阳': '109', '自贡': '111', '攀枝花': '112', '达州': '113', '雅安': '114', '眉山': '291', '甘孜': '417', '阿坝': '457', '凉山': '479', '南京': '125', '苏州': '126', '无锡': '127', '连云港': '156', '淮安': '157', '扬州': '158', '泰州': '159', '盐城': '160', '徐州': '161', '常州': '162', '南通': '163', '镇江': '169', '宿迁': '172', '武汉': '28', '黄石': '30', '荆州': '31', '襄阳': '32', '黄冈': '33', '荆门': '34', '宜昌': '35', '十堰': '36', '随州': '37', '恩施': '38', '鄂州': '39', '咸宁': '40', '孝感': '41', '仙桃': '42', '天门': '73', '潜江': '74', '神农架': '687', '杭州': '138', '丽水': '134', '金华': '135', '温州': '149', '台州': '287', '衢州': '288', '宁波': '289', '绍兴': '303', '嘉兴': '304', '湖州': '305', '舟山': '306', '福州': '50', '莆田': '51', '三明': '52', '龙岩': '53', '厦门': '54', '泉州': '55', '漳州': '56', '宁德': '87', '南平': '253', '哈尔滨': '152', '大庆': '153', '伊春': '295', '大兴安岭': '297', '黑河': '300', '鹤岗': '301', '七台河': '302', '齐齐哈尔': '319', '佳木斯': '320', '牡丹江': '322', '鸡西': '323', '绥化': '324', '双鸭山': '359', '济南': '1', '滨州': '76', '青岛': '77', '烟台': '78', '临沂': '79', '潍坊': '80', '淄博': '81', '东营': '82', '聊城': '83', '菏泽': '84', '枣庄': '85', '德州': '86', '威海': '88', '济宁': '352', '泰安': '353', '莱芜': '356', '日照': '366', '西安': '165', '铜川': '271', '安康': '272', '宝鸡': '273', '商洛': '274', '渭南': '275', '汉中': '276', '咸阳': '277', '榆林': '278', '延安': '401', '石家庄': '141', '衡水': '143', '张家口': '144', '承德': '145', '秦皇岛': '146', '廊坊': '147', '沧州': '148', '保定': '259', '唐山': '261', '邯郸': '292', '邢台': '293', '沈阳': '150', '大连': '29', '盘锦': '151', '鞍山': '215', '朝阳': '216', '锦州': '217', '铁岭': '218', '丹东': '219', '本溪': '220', '营口': '221', '抚顺': '222', '阜新': '223', '辽阳': '224', '葫芦岛': '225', '长春': '154', '四平': '155', '辽源': '191', '松原': '194', '吉林': '270', '通化': '407', '白山': '408', '白城': '410', '延边': '525', '昆明': '117', '玉溪': '123', '楚雄': '124', '大理': '334', '昭通': '335', '红河': '337', '曲靖': '339', '丽江': '342', '临沧': '350', '文山': '437', '保山': '438', '普洱': '666', '西双版纳': '668', '德宏': '669', '怒江': '671', '迪庆': '672', '乌鲁木齐': '467', '石河子': '280', '吐鲁番': '310', '昌吉': '311', '哈密': '312', '阿克苏': '315', '克拉玛依': '317', '博尔塔拉': '318', '阿勒泰': '383', '喀什': '384', '和田': '386', '巴音郭楞': '499', '伊犁': '520', '塔城': '563', '克孜勒苏柯尔克孜': '653', '五家渠': '661', '阿拉尔': '692', '图木舒克': '693', '南宁': '90', '柳州': '89', '桂林': '91', '贺州': '92', '贵港': '93', '玉林': '118', '河池': '119', '北海': '128', '钦州': '129', '防城港': '130', '百色': '131', '梧州': '132', '来宾': '506', '崇左': '665', '太原': '231', '大同': '227', '长治': '228', '忻州': '229', '晋中': '230', '临汾': '232', '运城': '233', '晋城': '234', '朔州': '235', '阳泉': '236', '吕梁': '237', '长沙': '43', '岳阳': '44', '衡阳': '45', '株洲': '46', '湘潭': '47', '益阳': '48', '郴州': '49', '湘西': '65', '娄底': '66', '怀化': '67', '常德': '68', '张家界': '226', '永州': '269', '邵阳': '405', '南昌': '5', '九江': '6', '鹰潭': '7', '抚州': '8', '上饶': '9', '赣州': '10', '吉安': '115', '萍乡': '136', '景德镇': '137', '新余': '246', '宜春': '256', '合肥': '189', '铜陵': '173', '黄山': '174', '池州': '175', '宣城': '176', '巢湖': '177', '淮南': '178', '宿州': '179', '六安': '181', '滁州': '182', '淮北': '183', '阜阳': '184', '马鞍山': '185', '安庆': '186', '蚌埠': '187', '芜湖': '188', '亳州': '391', '呼和浩特': '20', '包头': '13', '鄂尔多斯': '14', '巴彦淖尔': '15', '乌海': '16', '阿拉善盟': '17', '锡林郭勒盟': '19', '赤峰': '21', '通辽': '22', '呼伦贝尔': '25', '乌兰察布': '331', '兴安盟': '333', '兰州': '166', '庆阳': '281', '定西': '282', '武威': '283', '酒泉': '284', '张掖': '285', '嘉峪关': '286', '平凉': '307', '天水': '308', '白银': '309', '金昌': '343', '陇南': '344', '临夏': '346', '甘南': '673', '海口': '239', '万宁': '241', '琼海': '242', '三亚': '243', '儋州': '244', '东方': '456', '五指山': '582', '文昌': '670', '陵水': '674', '澄迈': '675', '乐东': '679', '临高': '680', '定安': '681', '昌江': '683', '屯昌': '684', '保亭': '686', '白沙': '689', '琼中': '690', '贵阳': '2', '黔南': '3', '六盘水': '4', '遵义': '59', '黔东南': '61', '铜仁': '422', '安顺': '424', '毕节': '426', '黔西南': '588', '银川': '140', '吴忠': '395', '固原': '396', '石嘴山': '472', '中卫': '480', '西宁': '139', '海西': '608', '海东': '652', '玉树': '659', '海南': '676', '海北': '682', '黄南': '685', '果洛': '688', '拉萨': '466', '日喀则': '516', '那曲': '655', '林芝': '656', '山南': '677', '昌都': '678', '阿里': '691'}
主程序
headers = {
'User-Agent': UserAgent(use_cache_server=False).random,
'Cookie': '你的cookie'
}
os.chdir(r'E:\桌面')
outwb = openpyxl.Workbook() # 打开一个将写的文件
outws = outwb.create_sheet(index=0) # 在将写的文件创建sheet
outws.cell(row = 1, column = 1, value = "provcode")
outws.cell(row = 1, column = 2, value = "provname")
outws.cell(row = 1, column = 3, value = "year")
outws.cell(row = 1, column = 4, value = "index")
rows = 2
for key in PROVINCE_CODE:
year_list = [2021,2020,2019,2018,2017,2016,2015,2014,2013,2012]
for i in range(len(year_list)):
year = year_list[i]
url = "https://index.baidu.com/api/SearchApi/index?area=" + str(PROVINCE_CODE[key]) + "&word= [[%7B%22name%22:%22%E4%BF%84%E4%B9%8C%E6%88%98%E4%BA%89%22,%22wordType%22:1%7D]]&startDate="+ str(year) + "-01-01&endDate="+ str(year) + "-12-31"
res = requests.get(url=url, headers=headers)
sleep(random.uniform(3,5)) # 设置休息时间,防止反爬
resjs = res.json()
index = resjs["data"]["generalRatio"][0]["all"]["avg"] #获取目标数据
print(key,year,index)
outws.cell(row = rows, column = 1, value = PROVINCE_CODE[key])
outws.cell(row = rows, column = 2, value = key)
outws.cell(row = rows, column = 3, value = year)
outws.cell(row = rows, column = 4, value = index)
rows = rows + 1
outwb.save("省级百度指数.xlsx")
运行结果

参考资料
[1] 郑思齐, 万广华, 孙伟增, 罗党论. 公众诉求与城市环境治理[J]. 管理世界, 2013, (6): 72-84.
[2] 李欣, 杨朝远, 曹建华. 网络舆论有助于缓解雾霾污染吗?——兼论雾霾污染的空间溢出效应[J]. 经济学动态, 2017, (6): 45-57.
[3] 唐松, 施文, 孙安其. 环境污染曝光与公司价值——理论机制与实证检验[J]. 金融研究, 2019, (8): 133-150.
[4] 刘志峰, 张婷婷. 投资者彩票偏好对股票价格行为的影响研究[J]. 管理科学学报, 2020, 23, (3): 89-99.
作者介绍
Wyl
厦门大学