当前位置: 首页 > news >正文

【爬虫基础】第一部分 网络通讯-编程 P3/3

上节内容回顾:【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客

                         【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客

相关文档,希望互相学习,共同进步

风123456789~-CSDN博客


前言 

1.知识点碎片化:每个网站实现的技术相似但是有区别,要求我们根据不同的网站使用不同的应对手段。主要是常用的一些网站爬取技术。

2.学习难度:入门比web简单,但后期难度要比web难,在于爬虫工程师与网站开发及运维人员的对抗。比如你写了爬虫但是被网站运维人员发现后添加反爬,那么就要解决反爬。即平台更新换代,爬虫策略需要实时更新。

3.学习特点:以摸个网站爬虫为讲解对象,即一个技术点的案例。

4.后续发展:要求掌握的东西多,工作中根据工作需要涉及到更多没有接触的知识。

5.法律层面:爬虫相关工作属于灰色地带,目前国内现行法律对于爬虫相关评判还没有明确制度。

6.建议:好记性不如烂笔头,建议多找网站进行爬取联系,同时做好笔记。

5 UDP 通信 

知识点:
    1.udp网络程序-发送数据
    2.udp网络程序-发、接收数据
    3.udp网络程序-绑定端口发送消息

5.1 udp网络程序-发送数据

创建一个基于udp的网络程序流程很简单,具体步骤如下:

1.创建客户端套接字

2.发送/接收数据

3.关闭套接字

客户端发送数据到服务器:

from socket  import  *  #不需要安装,是python解释器自带

udp_socket = socket(AF_INET , SOCK_DGRAM)  #ipv4  udp通信协议

send_data =' i love you'    #需要传输的数据

udp_addr = ('192.168.1.119',8988)    #数据发送的地址(将数据发送给谁)

udp_socket.sendto(send_data.encode('utf-8'),udp_addr)

# 转为字节流

udp_socket.close()  # 关闭套接字

说明: 

from socket import *
"""
不需要额外安装,是python解释器自带的模块
"""
# 创建udp通信的socket套接字对象
udp_socket = socket(AF_INET, SOCK_DGRAM)
# AF_INET: ipv4地址类型
# SOCK_DGRAM: UDP的通信协议# 需要传输的数据
send_data = '我爱你'# 数据发送的地址(将数据发送给谁)
udp_addr = ('192.168.110.76', 8080)# 执行发送
# gbk: windows的一般使用的解码格式
udp_socket.sendto(send_data.encode('gbk'), udp_addr)# 关闭套接字
udp_socket.close()

      运用网络调试工具:NetAssist.exe    它是一款专为快速定位网络故障而设计的实用工具。该工具的核心组件是netAssist.exe,它能够帮助用户诊断和解决网络连接和通信过程中遇到的各种问题和异常。无论是连接错误、通信中断、包丢失还是延迟问题,netAssist都能提供详细的诊断信息,帮助用户快速确定故障原因并找到解决方案。

     NetAssist.exe 启动起来,然后运行代码,即可发送数据成功。可能中文会乱码,换为gbk可以了,windows一般使用解码格式,linux 一般utf-8。  

5.2 udp网络程序-接收数据

"""udp接收数据"""
from socket import *# 创建udp套接字对象
udp_socket = socket(AF_INET, SOCK_DGRAM)# 定义接收方(接收数据)的地址
udp_addr = ('192.168.110.76', 8080)# 定义发送的消息
data = '你那边今天天气怎么样?'.encode('gbk')# 执行发送
udp_socket.sendto(data, udp_addr)# 接收对方发送的消息(接收服务器的消息)
recv_data = udp_socket.recvfrom(1024)# 1024: 本次接收的最大字节数
print(recv_data)
print(recv_data[0].decode('gbk'))
print(recv_data[1])# 关闭套接字
udp_socket.close()

5.3  udp网络程序-绑定端口发送消息

"""udp网络程序-绑定端口发送消息"""from socket import *while True:# 创建套接字对象udp_docket = socket(AF_INET, SOCK_DGRAM)# 绑定套接字本地端口udp_docket.bind(('', 9999))# ip地址一般不用写,表示本机的任何一个IPdata = '么么哒'udp_addr = ('192.168.110.76', 8080)udp_docket.sendto(data.encode('gbk'), udp_addr)recv_data = udp_docket.recvfrom(1024)print(recv_data[0].decode('gbk'))from requests_html import HTMLSessionsession = HTMLSession()url = 'https://gateway.36kr.com/api/mis/nav/newsflash/list'
data = {"partner_id":"web","timestamp":1682686589490,"param":{"pageSize":80,"pageEvent":1,"pageCallback":"eyJmaXJzdElkIjoyMjM1MDE1NzgwNTExMzY4LCJsYXN0SWQiOjIyMzQ5Mzg1ODU5MDI5ODEsImZpcnN0Q3JlYXRlVGltZSI6MTY4MjY4NjUzNzM4NCwibGFzdENyZWF0ZVRpbWUiOjE2ODI2ODE4MjU3OTksImxhc3RQYXJhbSI6IjEifQ","siteId":1,"type":0,"platformId":2}}
headers = {'Cookie': 'sajssdk_2015_cross_new_user=1; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22187c7ef656dfe6-0fcbd5dedc9fba-7e57547c-2073600-187c7ef656ebbb%22%2C%22%24device_id%22%3A%22187c7ef656dfe6-0fcbd5dedc9fba-7e57547c-2073600-187c7ef656ebbb%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E8%87%AA%E7%84%B6%E6%90%9C%E7%B4%A2%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fcn.bing.com%2F%22%2C%22%24latest_referrer_host%22%3A%22cn.bing.com%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%7D%7D; Hm_lvt_1684191ccae0314c6254306a8333d090=1682686568; Hm_lvt_713123c60a0e86982326bae1a51083e1=1682686568; Hm_lpvt_1684191ccae0314c6254306a8333d090=1682686579; Hm_lpvt_713123c60a0e86982326bae1a51083e1=1682686579','Host': 'gateway.36kr.com','Origin': 'https://www.36kr.com','Referer': 'https://www.36kr.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58'
}
response = session.post(url, json=data, headers=headers).json()
print(response)

 6.TCP 通信 

"""
课题:TCP通讯

知识点:
    1.python编码的转换
    2.TCP客户端开发流程
    3.TCP服务端开发流程
    4.多任务版TCP服务端程序开发
"""

6.1  python编码的转换

# str1 = '今天天气很好'
# print(str1.encode('utf-8'), type(str1.encode('utf-8')))
# 网络中,数据的传输都是以二进制的形式传输的
# bytes类型就是我们口中的二进制数据类型
# 编码:encode()
# 解码:decode()
# 编解码的格式:'utf-8', gbk, gb2312
# 万国码# result = str1.encode('utf-8')
# print(result.decode('utf-8'))# 客户端:面向的用户群体是客户
# 服务端:(服务器)面向的是开发者

"""tcp客户端和服务端开发"""
# 注意:主动发起建立连接请求的是客户端
# 等待接收请求的是服务端程序

# 面试要点:
# tcp三次握手和四次挥手

6.2 TCP 客户端开发

"""tcp客户端程序开发"""
from socket import *# 创建tcp_socket对象
tcp_socket = socket(AF_INET, SOCK_STREAM)
# 建立和服务器的连接
# 需求:IP地址,端口号
ip_port = ('192.168.110.76', 8080)
# (代码上的区别)与udp客户端程序的区别在与建立连接
tcp_client_socket = tcp_socket.connect(ip_port)
"""将数据从客户端发送给服务器"""
for i in range(4):data = '我喜欢你!'# 将需要传输的数据转换成二进制类型data_bytes = data.encode('gbk')# 将数据发送给服务器tcp_socket.send(data_bytes)
"""接收服务器传递过来的数据"""
recv_data = tcp_socket.recv(1024)
# 接收服务器发送过来的数据,最大接收1024个字节
print(f"接收到服务器发送过来的数据:{recv_data.decode('gbk')}")
# 关闭套接字
tcp_socket.close()

 6.3 TCP服务端开发流程

"""TCP服务端开发流程"""from socket import *# 创建tcp的socket对象tcp_socket = socket(AF_INET, SOCK_STREAM)# 设置端口号复用,程序退出,端口号立即释放tcp_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)# 绑定IP地址和端口ip_port = ('', 9090)tcp_socket.bind(ip_port)# 设置监听:128最大等待连接数tcp_socket.listen(128)# 若有新的客户端来链接这个服务端,那么就产生一个新的套接字专门为这个客户端服务client_socket, client_addr = tcp_socket.accept()# 获取客户端传递过来的消息"""此处接收的是服务器分配的服务的socket消息"""recv_data = client_socket.recv(1024)print(f"客户端发来:{recv_data.decode('gbk')}")# 关闭与这个客户端的套接字client_socket.close()tcp_socket.close()

6.4 多任务版TCP服务端程序开发 

"""TCP服务端开发流程"""
# 处理多个客户端发送过来的连接请求,与接收消息
from socket import *
from threading import Threaddef handle_client_request(client_socket, client_addr):print(f"接受到:{client_addr},发送来{client_socket.recv(1024).decode('gbk')}")if __name__ == '__main__':# 创建tcp_socket对象tcp_socket = socket(AF_INET, SOCK_STREAM)# 设置端口复用,程序退出,端口号立即释放tcp_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)# 绑定端口# 客户端可以通过这个端口号来找到我们这个服务器的tcp_socket服务ip_port = ('', 8080)tcp_socket.bind(ip_port)# 设置监听:tcp_socket.listen(128)while True:# 分配对客户端的服务client_socket, client_addr = tcp_socket.accept()t1 = Thread(target=handle_client_request, args=(client_socket, client_addr))# t1.setDaemon(True)  # 设置守护线程# 启动线程t1.start()

附录 Python 相关

    不同工具的优缺点和使用场景

    • PyCharm‌:功能全面,适合大型项目开发,但相对笨重,占用内存较多。‌
    • VS Code‌:轻量级,启动快,支持多种编程语言,适合多语言开发和需要快速上手的项目。
    • Jupyter Notebook‌:交互性强,适合数据科学和机器学习项目,易于共享结果。
    • Spyder‌:界面友好,适合数据科学和科研,但功能不如PyCharm强大。
    • Sublime Text‌:速度快,高度可定制性,适合各种编程需求,但需要自行安装插件。

    安装和使用建议

    • PyCharm‌:下载安装包后直接使用,社区版免费。
    • VS Code‌:通过官网下载安装包后,安装Python插件即可使用。‌
    • Jupyter Notebook‌:可以通过Anaconda安装,或者从官网下载后配置Python环境。
    • Spyder‌:通过Anaconda集成环境安装,适合数据科学和科研。
    • Sublime Text‌:下载安装包后,通过Package Control安装所需插件。

    最近文章阅读排行榜

    【Linux专栏】find命令+同步 实验-CSDN博客

    【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客

    【Oracle专栏】客户端expdp 实验验证-CSDN博客

    【Oracle专栏】Package 被误替换,恢复找回-CSDN博客

    【Linux & Oracle】杂货铺 日常实用2024-CSDN博客

    【Linux运维】非root用户的单向免密登录_linux 单向免密-CSDN博客

    【Oracle专栏】DBMS_CRYPTO 加密包、AES加解密_oracle aes解密-CSDN博客

    【Oracle专栏】ORA-06502:hex到raw的转换错误-CSDN博客

    【Oracle专栏】group by 和distinct 效率_group和distinct效率oracle-CSDN博客

     

    相关文章:

    【爬虫基础】第一部分 网络通讯-编程 P3/3

    上节内容回顾:【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客 【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客 相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 前言 1.知识点碎片化:每个网站实现…...

    Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atoi 函数

    ngx_atoi 声明在 src/core/ngx_string.h ngx_int_t ngx_atoi(u_char *line, size_t n); 定义在 src/core/ngx_string.c ngx_int_t ngx_atoi(u_char *line, size_t n) {ngx_int_t value, cutoff, cutlim;if (n 0) {return NGX_ERROR;}cutoff NGX_MAX_INT_T_VALUE / 10;cutlim…...

    PG:ERROR: cannot freeze committed xmax

    目录 原因**问题原因****PostgreSQL 底层逻辑** 解决方案1**问题分析****排查步骤****1. 检查长时间运行的事务****2. 检查未提交的事务****3. 检查 autovacuum 配置****4. 检查事务 ID 使用情况****5. 检查表的 relfrozenxid** **解决方法****1. 手动运行 VACUUM FREEZE****2.…...

    《论软件的可靠性评价》审题技巧 - 系统架构设计师

    论软件的可靠性评价写作框架 一、考点概述 软件可靠性评价作为软件可靠性活动的关键环节,是确保软件质量、提升用户体验的重要手段。本题主要考察以下几个方面的内容: 首先,本题要求考生理解并掌握软件可靠性评价的基本概念及其在软件开发…...

    【项目设计】自主HTTP服务器

    目录 项目介绍 网络协议栈介绍 协议分层 数据的封装与分用 HTTP相关知识介绍 HTTP的特点 URL格式 URI、URL、URN HTTP的协议格式 HTTP响应协议格式 HTTP的请求方法 HTTP的状态码 HTTP常见的Header CGI机制介绍 CGI机制的概念 CGI机制的实现步骤 CGI机制的意义 …...

    Linux操作系统:基于Linux的个人Web服务器搭建与自动化运维实践

    基于Linux的个人Web服务器搭建与自动化运维实践 摘要 在互联网的海洋中,每个人都想拥有一艘属于自己的小船——一个个人Web服务器。Linux作为开源界的“老大哥”,无疑是搭建Web服务器的最佳选择。本文通过幽默风趣的方式,详细介绍了在Linux…...

    [创业之路-321]:创新开拓思维和经营管理思维的比较

    目录 一、概述 1.1、定义与内涵 1、创新开拓思维: 2、经营管理思维: 1.2、特点与优势 1、创新开拓思维的特点与优势: 2、经营管理思维的特点与优势: 3、应用场景与限制 4、总结 二、创新开拓思维与经营管理思维&#xf…...

    vivado修改下载器下载速率

    Error Launching Program X Error while launching program: fpga configuration failed. DONE PIN is not HIGH 原因是下载器速度太快了。先从任务管理器中关闭hw_server.exe试一下,要是不行就按下面三种方法解决。 第一种方法可以不用修改下载速度,直接先从vivado中将bit流…...

    运维基线方案说明

    1. 总体思路 建立运维基线的核心目标是保障系统稳定性、提升安全性、及时响应异常事件并不断优化系统性能。初创公司资源有限,方案应尽可能简单、易用,同时具备一定的自动化和标准化能力。建议从以下几个层面入手: 标准化文档:制…...

    pycharm中配置PyQt6详细教程

    PyQt6 是 Qt 框架的 Python 绑定库,基于 Qt 6 开发,专为创建跨平台图形用户界面(GUI)应用程序设计。 本章教程,主要记录在pycharm中配置使用PyQt6的流程。 一、安装基础环境 在此之前,你需要提前安装好Python解释器,推荐使用anaconda创建虚拟环境。 conda create -n pyt…...

    大湾区经济网报道:2025春运收官 全国跨区流动90亿,大湾区12亿人次

    (原标题:2025年春运收官:全国跨区流动超90亿人次 大湾区贡献12亿人次) 大湾区经济网2月23日电(记者 余芳)2025年春运昨日(2月22日)正式结束,全国跨区域人员流动量达90.2…...

    Docker用户的困境:免费项目的减少与成本的增加

    摘要 在生产环境中,Docker用户正面临新的挑战:免费项目逐渐减少,收费服务成为主流趋势。表面上免费的选项,由于缺乏必要的支持和及时更新,反而可能导致更高的隐性成本。对于依赖Docker进行开发和部署的企业而言&#x…...

    1.4 嵌入式系统的软件

    嵌入式系统的开发流程中,硬件和固件设计完成后,嵌入式软件承担起实现功能、用户交互、系统集成和性能优化等任务;嵌入式系统软件分为设备驱动、操作系统和应用程序三个层面。 因此嵌入式系统软件开发工程师通常分为三类:嵌入式系统…...

    PHP2(WEB)

    ##解题思路 打开页面什么线索都没有,目录扫描只是扫出来一个index.php,而源代码没有东西,且/robots.txt是不允许访问的 于是一番查询后发现,有个index.phps的文件路径,里头写着一段php的逻辑,对url的id参数…...

    【精调】LLaMA-Factory 快速开始1: Meta-Llama-3.1-8B-Instruct

    llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml llamafactory-cli chat examples/inference/llama3_lora_sft.yaml llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml模型下载 git clone https://www.modelscope.cn/LLM-Research/Meta-Lla…...

    一、计算机等级考试——题库

    (1)选择题 (2)基本操作题 (3)上网题 (4)文字题 (5)表格题 (6)演示文稿 二、计算机等级考试——标准评分 (1)选…...

    Android系统开发 给system/app传包报错

    一、现象 adb 命令推送apk到system/app下提示 remote couldnt create file: Read-only file system demo /oem/appsystem app 在Android设备上,/system 分区通常是只读的(Read-only file system),这意味着普通用户或应用程序…...

    libxls库的编译以及基于Visual studio的配置

    最近有一个需求在windows处理xls,所以就需要libxls这个库,调查了一下,基于C的库的解析情况如下: 所以最理想的就是Libxlsd个开源的方案 基于历史整理的 libxls 在 MinGW 下的编译步骤 前提条件 系统:Windows&#…...

    OpenHarmony构建系统-GN与子系统、部件、模块理论与实践

    理论 OpenHarmony源码体系 OpenHarmony的源码架构基于模块化设计,为了方便系统的功能的增加和裁剪,设计了基于GN构建的模块系统。整个模块可从大到小划分为产品(product)、领域/子系统集(domain)、子系统(sub system)、部件(component)、模块/组件(modu…...

    kafka+spring cloud stream 发送接收消息

    方案 1&#xff1a;使用旧版 StreamListener&#xff08;适用于 Spring Cloud Stream < 2.x&#xff09; 1. 添加依赖&#xff08;pom.xml&#xff09; <!-- Spring Cloud Stream Kafka Binder --> <dependency> <groupId>org.springframework.clo…...

    地震勘探——干扰波识别、井中地震时距曲线特点

    目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

    React hook之useRef

    React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

    PHP和Node.js哪个更爽?

    先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

    从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

    先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

    前端倒计时误差!

    提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

    蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

    前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

    鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

    一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

    汇编常见指令

    汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

    C++:多态机制详解

    目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

    vulnyx Blogger writeup

    信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...