过年不再被逼相亲——我用python给亲戚展示2022的相亲数据

news2024/11/25 4:20:15

人生苦短 我用Python

这不是快过年了吗?

又到了一年一度的亲戚大考验环节…


没对象的他们会问你,找对象了吗?

你要是学计算机专业的,他们会问你,会修电脑吗?

出去学了点啥他们也会要求“才艺展示一下

我相信大家都躲不过去


既然躲不过去,那直接上猛药给亲戚吓一跳吧

用python直接来采集一波相亲网站,并做数据分析

又给亲戚露一手,又向他们表达了自己单着是客观不可抗力

这波,啊这波,我看谁还敢催我找对象???

在这里插入图片描述


环境开发:

Python 3.8
Pycharm

模块使用:

    import parsel       --> pip install parsel
    import requests     --> pip install requests
    import csv
    import re

思路流程:

一. 数据来源分析:

1. 明确需求:
采集数据是什么 —> 资料数据 <静态网页>
都是在网页源代码里面

在这里插入图片描述

二. 代码实现步骤:

1.发送请求,模拟浏览器对于url地址发送请求
2.获取数据,获取服务器返回响应数据
3.解析数据,提取我们想要数据内容
4.保存数据,把数据内容保存本地


开始代码:导入数据请求模块

源码、资料电子书点击这里

import requests
# 导入数据解析模块
import parsel
# 导入csv
import csv
# 导入正则
import re
f = open('data.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['昵称',
                                           '性别',
                                           '年龄',
                                           '身高',
                                           '体重',
                                           '出生日期',
                                           '生肖',
                                           '星座',
                                           '籍贯',
                                           '所在地',
                                           '学历',
                                           '婚姻状况',
                                           '职业',
                                           '年收入',
                                           '住房',
                                           '车辆',
                                           '照片',
                                           '详情页',
                                           ])
csv_writer.writeheader()

在这里插入图片描述
在这里插入图片描述

都是一些公开数据


1. 发送请求, 模拟浏览器对于url地址发送请求

模拟浏览器 headers 请求头

可以在开发者工具里面复制粘贴的

防止被反爬

<Response [200]> 响应对象

200状态码 表示请求成功

for page in range(1, 11):
    # 伪装模拟
    headers = {
        # User-Agent 用户代理, 表示浏览器基本信息
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
    }

发送请求

    response = requests.get(url=url, headers=headers)
    print(response)

2. 获取数据, 获取服务器返回响应数据

开发者工具 —> response

response.json() 获取响应json数据, 字典数据类型

3. 解析数据, 提取我们想要数据内容

详情页ID —> UID

因为得到数据: 字典数据类型

所以解析数据: 键值对取值 —> 根据冒号左边的内容[键], 提取冒号右边的内容[值]

    # for循环遍历, 把列表里面元素一个一个提取出来
    for index in response.json()['data']['items']:
        #  https://love.19lou.com/detail/51593564  format 字符串格式化方法
        link = f'https://love.19lou.com/detail/{index["uid"]}'

4. 发送请求, 模拟浏览器对于url地址发送请求

资料详情页url地址

5. 获取数据, 获取服务器返回响应数据

网页源代码

response.text 获取响应文本数据, 返回字符串数据类型

response.json() 获取响应json数据, 字典数据类型

        html_data = requests.get(url=link, headers=headers).text

6. 解析数据, 提取我们想要数据内容

基本资料信息

css选择器: 根据标签属性内容提取数据

xpath: 根据标签节点提取数据

re正则

        # 把获取下来 html字符串数据<html_data>, 转成可解析对象
        selector = parsel.Selector(html_data)
        name = selector.css('.username::text').get()
        info_list = selector.css('.info-tag::text').getall()
        # . 表示调用方法属性
        gender = info_list[0].split(':')[-1]
        age = info_list[1].split(':')[-1]
        height = info_list[2].split(':')[-1]
        date = info_list[-1].split(':')[-1]
        # 判断info_list元素个数  当元素个数4个 说明没有体重一栏
        if len(info_list) == 4:
            weight = '0kg'
        else:
            weight = info_list[3].split(':')[-1]
        info_list_1 = selector.css('.basic-item span::text').getall()[2:]
        zodiac = info_list_1[0].split(':')[-1]
        constellation = info_list_1[1].split(':')[-1]
        nativePlace = info_list_1[2].split(':')[-1]
        location = info_list_1[3].split(':')[-1]
        edu = info_list_1[4].split(':')[-1]
        maritalStatus = info_list_1[5].split(':')[-1]
        job = info_list_1[6].split(':')[-1]
        money = info_list_1[7].split(':')[-1]
        house = info_list_1[8].split(':')[-1]
        car = info_list_1[9].split(':')[-1]
        img_url = selector.css('.page .left-detail .abstract .avatar img::attr(src)').get()
        # 把获取下来的数据 保存字典里面  字典数据容器
        dit = {
            '昵称': name,
            '性别': gender,
            '年龄': age,
            '身高': height,
            '体重': weight,
            '出生日期': date,
            '生肖': zodiac,
            '星座': constellation,
            '籍贯': nativePlace,
            '所在地': location,
            '学历': edu,
            '婚姻状况': maritalStatus,
            '职业': job,
            '年收入': money,
            '住房': house,
            '车辆': car,
            '照片': img_url,
            '详情页': link,
        }
        csv_writer.writerow(dit)
        new_name = re.sub(r'[\/"*?<>|]', '', name)

保存图片, 获取图片二进制数据

        img_content = requests.get(url=img_url, headers=headers).content
        with open('data\\' + new_name + '.jpg', mode='wb') as img:
            img.write(img_content)
        print(dit)

效果展示:

源码、资料电子书点击这里

在这里插入图片描述
在这里插入图片描述

整理成表:

在这里插入图片描述
在这里插入图片描述

今天的文章就是这样啦~

不管世界如何,只有学习,才能使你立于不败之地。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

少儿Python每日一题(2):整数的位数

原题解答 本次的题目如下所示&#xff08;原题出处&#xff1a;蓝桥杯&#xff09;&#xff1a; 【编程实现】 输入一个正整数&#xff0c;输出这个正整数是一个几位数。 输入描述&#xff1a;输入一个正整数 输出描述&#xff1a;输出这个正整数是一个几位数 【样例输入】 12…

FineReport开源报表软件- 数据库表字段控制Tab块隐藏

1. 概述 1.1 预期效果 通过数据库表中设置的字段值&#xff0c;控制决策报表的每个 Tab 块是否显示&#xff0c;如下图所示&#xff1a; 数据库表字段&#xff1a;SITUATION 字段的值控制 Tab 是否显示。 效果展示&#xff1a;一共有 4 个 Tab 块&#xff1a;春、夏、秋、冬&…

Verilog HDL 硬件描述语言基础

HDL 硬件描述语言&#xff08;Hardware Description Lagnuage&#xff0c;HDL&#xff09;通过描述硬件的实现方法&#xff0c;来 产生与之对应的真实的硬件电路&#xff0c;最终实现所设计的预期功能。 Verilog HDL 和 C 语言的比较 C 语言所描述的代码功能在执行时都是一行…

K8s Liveness/Readiness/Startup 探针机制

官方参考文档 目录前言一、默认健康检测1.1 restartPolicy1.2 测试案例二、Liveness三、Readiness四、Startup前言 玩过 Docker Swarm 的应该都知道&#xff0c;有一种功能叫自愈功能&#xff0c;当集群检测到节点或服务故障时回进行自动故障转移&#xff0c;从而保障业务的可…

Python循环语句条件控制语句

一、while循环 1、条件为true&#xff0c;执行循环体&#xff1b;条件为false&#xff0c;退出循环体&#xff1b; while 判断条件: 执行语句 2、单纯的while语句 3、配合if条件句使用 4、配合else使用 二、for循环 即可迭代的对象&#xff1b; 如何判断对象是否可迭代&…

python之tkinter学习

python图形化界面导论为窗口命名&#xff08;root.wm_title("")&#xff09;label类&#xff08;仅用来显示信息&#xff09;仅有一个标签多标签按钮command绑定事件bind绑定事件为button设置属性pack的布局grid布局事件及其绑定bind函数中的事件类型解绑输入框菜单子…

SEO 基础知识遇上圣诞节

*2022年圣诞节到来啦,很高兴这次我们又能一起度过~ SEO 基础知识 文章目录 SEO 基础知识1、SEO是什么2、SEO工作内容3、网站排名的流程数据4、认识搜索引擎爬虫4.1 什么是爬虫4.2 模拟普通用户5、网络爬虫的管理规则6、用数据快速提升网络权重7、其他工具1、SEO是什么 SEO 即…

【Javassist】快速入门系列08 当检测到对象(不包括数组)创建时用代码块替换

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

Docker Desktop 4.15 正式发布,这里是新功能

Docker Desktop 4.15 正式发布&#xff0c;这里是新功能 Docker Desktop 4.15现在可用于所有平台&#xff1a;Linux、Windows 和 macOS。它附带 Docker Compose v2.13.0、Containerd v1.6.10 和 Docker Hub Tool v0.4.5 2 主要亮点 VirtioFS 正式发布新的快速搜索功能在任何…

杨校老师课堂之JDK1.8下载、安装与环境变量配置

一、安装 1. 安装引导 2. 修改安装目录(路径) 3. 选择后的路径如下&#xff1a; 4. JRE的安装【可选】 5. 成功安装 二、配置 环境变量配置 1. 进行校验 win R 打开cmd窗口 在新建cmd内&#xff0c;输入javac&#xff0c;出现下列内容&#xff0c;即表示未配置成功。目前尚…

Eclipse 插件 ERMaster安装与使用

ERMaster 是什么&#xff1f; ERMaster是制作ER图&#xff08;Entity Relationship Diagram&#xff0c;实体关系图&#xff09;的Eclipse插件。 提供了从数据库导入、Excel表定义簿制作、图片输出、DDL输出等功能。支持的数据库包括&#xff1a; MySQLOraclePostgreSQLDB2HS…

Windows内核--内核空间和用户空间(3.6)

内核喜欢抽象出句柄给用户空间 句柄, Handle, 表达处理、控制之意。内核不会直接暴露指针给用户空间&#xff0c;这样会增大内核风险。相反&#xff0c;内核抽象出Handle给用户态&#xff0c;不管是文件、进程、线程等对象&#xff0c;通过Handle可以隐藏内核细节&#xff0c;统…

C++不知算法系列之解析回溯算法中的人文哲学

1. 前言 回溯算法让我想起“退一步海阔天空”的名言。当事情的发展到了绝境或是边缘时&#xff0c;可以试着后退一步&#xff0c;换一个方向、换一种策略&#xff0c;或许会看到新的出路或生机。 回溯算法的精髓&#xff1a;无所畏惧而不固执&#xff0c;善于在变通中迂回。故…

基于PyTorch的图像数据归一化min-max normalization和zero-mean normalization操作实践对比分析

本文紧接前文&#xff1a; 《python基于不同方法实现特征工程常用的归一化技术Normalization对比分析》 前文主要是讲解对于数值型特征数据在特征工程或者是数据处理阶段往往需要用到数据尺度归一化操作&#xff0c;基于原生的对象和numpy第三方库分别实现了按列归一化计算和…

一文告诉你什么是开源表单系统

熟悉市场的人都知道&#xff0c;传统的表单存在效率低的瓶颈&#xff0c;无法满足当前很多企业的业务需求。开源表单系统也是顺应时代发展需求应运而生的产物&#xff0c;在提升企业办公效率和协作效率&#xff0c;推动企业数字化转型方面意义重大。今天这篇文章就告诉大家什么…

《计算机网络》——第一章知识点

考试题型: 选择题填空题判断题简答题计算题ISP:因特网服务提供者/因特网服务提供商&#xff0c;是一个向广大用户综合提供互联网接入业务、信息业务、和增值业务的公司&#xff0c;如中国电信、中国联动、中国移动等。分为主干ISP、地区ISP和本地ISP。 计算机网络∶利用通信线…

前端的实例化是什么?

我们在用vue框架的时候&#xff0c;总是会看到各种各样的实例化或者说实例化对象(实例) 所以这篇文章就谈一下什么是实例化和实例化对象(实例)&#xff0c;以及为什么要实例化的问题 前端的实例化是什么&#xff1f;vue的createApppinia的实例化为什么要实例化再一次回答上面这…

关于缓存问题的思考与总结

提到缓存&#xff0c;最容易想到的便是Redis了。Redis凭借其出色的性能表现&#xff0c;十分适合做缓存。那么为什么需要缓存这个东西以及缓存用在哪些地方呢&#xff1f; 一、基本原理 存储层次模型 注&#xff1a;也是背景来源 想要设计好的架构或者应用、程序&#xff0c…

Maven安装配置的保姆级教程

前言 下面是关于maven的一些介绍&#xff1a; maven是一个项目构建和管理的工具&#xff0c;提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等maven的好处在于可以将项目过程规范化、自动化、高效化以及…

C++程序设计——继承与派生

更多内容可以查看系列文章C语言入门全教程&#xff08;持续更新&#xff09; 目录 前言 一、继承的概念 1.楔子 2.派生类的定义 3.继承和派生的意义 4.案例1&#xff1a;派生类的定义 二、继承方式 1.公有继承&#xff08;public&#xff09; 2.保护继承&#xff08;…