【爬虫基础】第一部分 网络通讯-编程 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地址一般不用写,表示本机的任何一个IP
     data = '么么哒'
     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 HTMLSession

session = 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 Thread


def 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博客

相关推荐
ktkiko111 小时前
Websocket——心跳检测
网络·websocket·网络协议
GGGGGGGGGGGGGG.2 小时前
hapxory-ACL基础介绍及案例
运维·服务器·网络
奔跑吧邓邓子2 小时前
【Python爬虫(34)】Python多进程编程:开启高效并行世界的钥匙
开发语言·爬虫·python·多进程
小梁不秃捏3 小时前
HTTP 常见状态码技术解析(应用层)
网络·网络协议·计算机网络·http
网安加云课堂3 小时前
课程分享 | 安全系统建设的挑战与解决方案
网络·安全·web安全
learning-striving3 小时前
eNSP下载安装(eNsp、WinPcap、Wireshark、VirtualBox下载安装)
网络·计算机网络·华为·路由器·ensp·交换机
黑客Ela4 小时前
网络安全营运周报
网络·安全·web安全
挣扎与觉醒中的技术人4 小时前
网络安全入门持续学习与进阶路径(一)
网络·c++·学习·程序人生·安全·web安全
技术小齐5 小时前
网络运维学习笔记 017HCIA-Datacom综合实验01
运维·网络·学习
dme.5 小时前
Python爬虫selenium验证-中文识别点选+图片验证码案例
爬虫·python