1.课题背景及意义
当下大龄剩男剩女数量日益增加, “催婚”和“婚姻”成为社会关注和网上热议的热门话题。近五年来25-39岁的单身人口数量逐年递增,适婚年龄段人口的性别比也在持续攀升,或将有超3000万青年男性成为剩男。这意味着一面“恐催婚”,一面“结婚难”已然成为当下年轻人面临的现状。
据珍爱网网络调问卷查调查显示,现在的年轻人其实并不是绝对的不婚主义者,反而多数人是期待爱情降临的,但是,这并不代表着年轻人愿意随意恋爱和结婚。尽管婚恋难是不争的事实,但多数青年仍然愿意等待而不是将就,将有无感觉、是否有感情和今后的婚姻质量放在了重要位置,择偶更看对方的能力,宁缺毋滥是多数青年男女的共识。
现在的年轻人婚恋更重视内在的匹配度、心灵的契合度以及性格与认知的契合度,这是婚姻品质的基本保证,但客观上也无疑增加了婚恋的成本和成功的难度,年轻人结婚难的问题已经迫在眉睫。
所以我们决定利用大数据对目前主流婚恋网站上的数据进行清洗汇总并以可视化的方式展现出来,以便得出一些输入的理论和结论来解释目前的问题,并为未来提出更加具体的婚恋问题解决方案提供一个较为基础的数据支撑。
针对我们清洗获得的多列数据,以及大数据算法加工过后的多元数据,我们选取了很多可视化展示的方法。基于python 平台 我们选择了pandas作为我们数据处理的依赖,matplotlib生成简单图片,利用sklearn进行了降维处理方便可视化展示。对于词频分析,我们选取了wordcloud这一库进行词云的生成。而对于频繁模式挖掘的数据,matplot已经无法满足我们的需求,我们转而选取基于web的echarts进行可视化展示,并且生成了web页面。
目录
- 课题背景及意义 2
- 技术路线 3
- 数据采集 4
3.1 爬虫流程 4
3.2 反反爬虫 5
3.3 异步 6
3.4 CI/CD 6 - 数据清洗 6
4.1 数据清洗 6
4.2 数据保存 9
4.3 结果一览 10 - 数据加工与大数据分析算法 10
5.1 词频计算 10
5.2 频繁模式挖掘 11
5.3 聚类算法 12 - 可视化 13
6.1 技术栈选取 13
6.2 直接数据可视化展示 13
6.3 大数据分析算法结果 16 - 结果论证 19
7.1 结论一 20
7.2 结论二 20
7.3 结论三 20
爬虫部分代码:
import asyncio
from single_spider import JiaYuanSpider, ZhenAiSpider
import os
import sys
from threading import Lock
from async_spider import AsyncJiaYuanSpider
# 获取账户信息
def get_account():
if not os.path.exists("account.txt"):
username = input("请输入用户名: ")
password = input("请输入密码: ")
with open("account.txt", "w+") as account:
account.write(username)
account.write("\n")
account.write(password)
else:
with open("account.txt", "r+") as account:
username = account.readline()
password = account.readline()
print("您的用户名为: {}".format(username))
print("您的密码为: {}".format(password))
return (username, password)
def get_cookies():
if not os.path.exists("cookie.txt"):
cookie = input("请输入 Cookie: ")
with open("cookie.txt", "w+") as cookie_txt:
cookie_txt.write(cookie)
else:
cookie_txt = open('cookie.txt', 'r+')
cookie = cookie_txt.readline()
cookie_txt.close()
print("Cookie 为 {}".format(cookie))
return cookie
def single_jiayuan_main():
cookie = get_cookies()
url = 'https://search.jiayuan.com/v2/search_v2.php'
spider = JiaYuanSpider(url, cookie, "data/世纪佳缘-测试.csv")
for page in range(1, 2):
payload = [
('sex', 'f'),
('key', ''),
('stc', '23:1'),
('sn', 'default'),
('sv', '1'),
('p', str(page)),
('f', ''),
('listStyle', 'bigPhoto'),
('pri_uid', '254091710'),
('jsversion', 'v5')
]
spider.run(page, payload)
def single_zhenai_main():
url = "http://www.zhenai.com/zhenghun"
spider = ZhenAiSpider(url, "data/珍爱.csv")
spider.run()
async def async_jiayuan_main():
if(len(sys.argv) < 4):
print("[Error] 至少需要四个参数")
sys.exit(-1)
start_page = sys.argv[1]
end_page = sys.argv[2]
filename = sys.argv[3]
cookies = get_cookies()
write_lock = Lock()
url = "https://search.jiayuan.com/v2/search_v2.php"
spider = AsyncJiaYuanSpider(url, cookies, filename, write_lock)
for page in range(int(start_page), int(end_page)):
payload = [
('sex', 'f'),
('key', ''),
('stc', '23:1'),
('sn', 'default'),
('sv', '1'),
('p', str(page)),
('f', ''),
('listStyle', 'bigPhoto'),
('pri_uid', '254091710'),
('jsversion', 'v5')
]
run_task = asyncio.create_task(spider.run(page, payload))
await run_task
if __name__ == '__main__':
# asyncio.run(async_jiayuan_main())
# single_jiayuan_main()
asyncio.run(async_jiayuan_main())