声明:此文并不是标题党,如果你不满18岁,请马上关闭,在父母陪同下观看也不行。
本文的数据抓取自国内最大的亚文化视频社区网站(不,不是 B 站),其中用户出于各种目的会在发帖的标题中加入城市名称,于是本文抓取了前10000个帖子的标题和发帖用户 ID,由于按照最近发帖的顺序排列,所以抓取数据基本上涵盖了2016年期间的发帖内容。然后通过匹配提取标题中所包含的城市信息,对16年活跃用户的归属地进行分析统计,另根据最近发布的《2016年中国主要城市 GDP 排名》:
检验两者之间是否存在某种程度的相关。
爬虫
当然本文的目的主要还是出于纯粹的技术讨论与实践,数据抓取和分析处理均使用 Python 完成,其中主要用到的数据处理和可视化工具包分别是Pandas和Plot.ly+Pandas。
由于网站使用较传统的论坛框架,经测试也没有防爬虫的措施,因此可以大胆地使用多线程,对于网页内容分析也可以直接用正则匹配完成:
import requests as req import re from threading import Thread def parser(url): res = req.get(url) html = res.text.encode(res.encoding).decode() titles = re.findall(RE_TITLE, html) v = [] if titles is not None: for title in titles: if len(title) == 2 and title[-1] != 'admin': if title[0][-1] != '>': v.append(title) return v def worker(rag): """ 将每个线程的数据临时存储到一个新的文本文件中即可。 """ with open('{}+{}.txt'.format(rag), 'w+') as result: for p in range(rag): url = ENT_PAT.format(p) for title in parser(url): result.write("{}|{} ".format(*title)) def main(): threads = [] for i in range(len(SECTIONS)-1): threads.append(Thread(target=worker, args=(SECTIONS[i:i+2],))) for thr in threads: thr.start() if name == 'main': main()
以上就是爬虫