• 【python爬虫笔记】服务器端搭建


    目录

    传统TCP服务器端搭建 

    传统TCP客户端搭建 

    引入非阻塞的TCP服务器

    爬虫实战:

    使用socket建造一个服务端

     使用socket建造一个客户端  爬取百度首页


    传统TCP服务器端搭建 

    1. # -*- coding: utf-8 -*-
    2. """
    3. __author__ = 孤寒者
    4. """
    5. import socket
    6. # 1.服务器对象 socket.AF_INET:使用IPV4; socket.SOCK_STREAM:使用socket套接字。
    7. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    8. # 2.绑定IP和端口号
    9. server.bind(("127.0.0.1",8080))
    10. # 3.监听 设置接收数
    11. server.listen(128)
    12. print('服务器开启', 8080)
    13. # 4.处理连接
    14. # accept()理解就是三次握手建立连接。
    15. # accept是一个阻塞的方法(你不来我就不动!),等待连接,每建立一个连接就会创建一个单独的通道。
    16. # conn:通道参数;addr:通道地址(客户端连接服务端的IP和端口号,这个客户端的端口号是随机生成的!)。
    17. new_cli, addr = server.accept()
    18. # 打印一下ip和端口号的类型
    19. print('来自一个新的连接', addr, type(addr))
    20. # 5.设置接收数据的大小
    21. data = new_cli.recv(1024)
    22. print(data)
    23. # 6.关闭这个连接的通道
    24. new_cli.close()
    25. # 关闭整个服务器
    26. server.close()

    传统TCP客户端搭建 

    1. # -*- coding: utf-8 -*-
    2. """
    3. __author__ = 孤寒者
    4. """
    5. import socket
    6. # 建立服务器对象 通过打印这个client服务器对象可知:默认使用的是IPV4,协议是TCP。
    7. client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    8. # 指定服务器的ip和端口号
    9. client.connect(('127.0.0.1',8080))
    10. # 发送数据给服务器
    11. client.send(b'hello server')
    12. # 指定发送给服务器的文件大小
    13. data = client.recv(1024)
    14. print(data)
    • 传统TCP服务器中.accept()方法是阻塞的,会造成阻塞形成网络等待
    • 在TCP服务器中使用协程,引入非阻塞,解决服务器和客户端两个线程的切换问题

    引入非阻塞的TCP服务器

    1. import socket
    2. import threading
    3. def handle_func(new_sock):
    4. while True:
    5. data = new_sock.recv(4) # 接收数据
    6. print(data)
    7. if data is None:
    8. break
    9. new_sock.close()
    10. while 1:
    11. # 服务器对象 socket.AF_INET:使用IPV4; socket.SOCK_STREAM:创建一个socket套接字。
    12. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    13. # 绑定服务器
    14. server.bind(("127.0.0.1", 8000))
    15. # 监听
    16. server.listen(128)
    17. print('服务器开启', 8000)
    18. # accept是一个阻塞的方法(你不来我就不动!),等待连接,每建立一个连接就会创建一个单独的通道。
    19. # conn:通道参数;addr:通道地址(客户端连接服务端的IP和端口号,这个客户端的端口号是随机生成的!)。
    20. new_cli, addr = server.accept()
    21. # 打印一下ip的类型
    22. print('来自一个新的连接', addr, type(addr))
    23. server.setblocking(False) # 设置套接字为非阻塞 找epoll使用 解决网络的等待问题
    24. # 注意:协程要依附于线程!
    25. task = threading.Thread(target=handle_func, args=(new_cli,))
    26. task.start()

    爬虫实战:

    使用socket建造一个服务端

    1. import socket
    2. # 服务器对象
    3. server = socket.socket()
    4. '''
    5. 等同于:server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    6. socket.AF_INET:使用IPV4;
    7. socket.SOCK_STREAM:创建一个socket套接字。
    8. '''
    9. # 1.绑定服务器
    10. server.bind(("0.0.0.0",8800)) #0.0.0.0是允许所有人来访问;8800是端口号
    11. # 2.监听
    12. server.listen(5)
    13. while True:
    14. # 3.等待连接
    15. # accept是一个阻塞的方法(你不来我就不动!),等待连接,每建立一个连接就会创建一个单独的通道。
    16. # conn:通道参数;addr:通道地址。
    17. conn,addr=server.accept()
    18. # 4.接收数据
    19. data=conn.recv(1024)
    20. print(data)
    21. response="HTTP/1.1 200 OK\r\nContent-Type: text/html;charset=utf-8;\r\n\r\n

      我很帅!

      "

    22. # 5.发送数据
    23. conn.send(response.encode())
    24. print("已经响应")
    25. # 6.关闭
    26. server.close()

     使用socket建造一个客户端  爬取度首页

    1. import socket
    2. # 建立服务器对象 通过打印这个client服务器对象可知:默认使用的是IPV4,协议是TCP。
    3. client=socket.socket()
    4. # 1.建立连接
    5. client.connect(("www.baidu.com",80))
    6. # 构造请求报文
    7. data=b"GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n"
    8. # 2.发送请求
    9. client.send(data)
    10. res=b""
    11. # 3.接收数据
    12. temp=client.recv(4096)
    13. while temp:
    14. print("*"*50)
    15. res += temp
    16. temp = client.recv(4096)
    17. print(temp.decode())
    18. # 4.断开连接
    19. client.close()

    爬取到的内容如下: 

    D:\Anaconda3\envs\pythonProject\python.exe C:\Users\--.DESKTOP-M7596IU\PycharmProjects\pythonProject\jbkljvhcgfd.py 
    **************************************************
    wrapper .s_ipt_wr:hover #kw{border-color:#a7aab5}#head_wrapper #kw{width:512px;height:16px;padding:12px 16px;font-size:16px;margin:0;vertical-align:top;outline:0;box-shadow:none;border-radius:10px 0 0 10px;border:2px solid #c4c7ce;background:#fff;color:#222;overflow:hidden;box-sizing:content-box}#head_wrapper #kw:focus{border-color:#4e6ef2!important;opacity:1}#head_wrapper .s_form{width:654px;height:100%;margin:0 auto;text-align:left;z-index:100}#head_wrapper .s_btn{cursor:pointer;width:108px;height:44px;line-height:45px;padding:0;background:0 0;background-color:#4e6ef2;border-radius:0 10px 10px 0;font-size:17px;color:#fff;box-shadow:none;font-weight:400;border:none;outline:0}#head_wrapper .s_btn:hover{background-color:#4662d9}#head_wrapper .s_btn:active{background-color:#4662d9}#head_wrapper .quickdelete-wrap{position:relative}#s_top_wrap{position:absolute;z-index:99;min-width:1000px;width:100%}.s-top-left{position:absolute;left:0;top:0;z-index:100;height:60px;padding-left:24px}.s-top-left .mnav{margin-right:31px;margin-top:19px;display:inline-block;position:relative}.s-top-left .mnav:hover .s-bri,.s-top-left a:hover{color:#315efb;text-decoration:none}.s-top-left .s-top-more-btn{padding-bottom:19px}.s-top-left .s-top-more-btn:hover .s-top-more{display:block}.s-top-right{position:absolute;right:0;top:0;z-index:100;height:60px;padding-right:24px}.s-top-right .s-top-right-text{margin-left:32px;margin-top:19px;display:inline-block;position:relative;vertical-align:top;cursor:pointer}.s-top-right .s-top-right-text:hover{color:#315efb}.s-top-right .s-top-login-btn{display:inline-block;margin-top:18px;margin-left:32px;font-size:13px}.s-top-right a:hover{text-decoration:none}#bottom_layer{width:100%;position:fixed;z-index:302;bottom:0;left:0;height:39px;padding-top:1px;overflow:hidden;zoom:1;margin:0;line-height:39px;background:#fff}#bottom_layer .lh{display:inline;margin-right:20px}#bottom_layer .lh:last-child{margin-left:-2px;margin-right:0}#bottom_layer .lh.activity{font-weight:700;text-decoration:underline}#bottom_layer a{font-size:12px;text-decoration:none}#bottom_layer .text-color{color:#bbb}#bottom_layer a:hover{color:#222}#bottom_layer .s-bottom-layer-content{text-align:center}

    爬取图片待补充。。。 

    一篇万字博文带你入坑爬虫这条不归路

     1.Tornado简介&&本专栏搭建tornado项目简介

     python中的线程threading.Thread()使用详解_

    python爬虫入门教程:爬取网页图片

  • 相关阅读:
    百度面试题:为什么使用接口而不是直接使用具体类?
    gltf和glb格式模型用什么软件处理
    湖南湘菜 7页面 美食主题 带设计说明 美食网页设计制作 HTML美食网页成品 美食网页成品 HTML美食网页设计
    云联盟 零信任实战框架 学习记录
    【博客458】BGP(边界网关协议)-----状态机
    毕业设计-基于机器学习的图片处理图片倾斜校正
    Three.js一学就会系列:02 画线
    Temporal Action Proposal Generation with Transformers TAPG transformer论文阅读笔记
    Vite 的基本原理,和 webpack 在开发阶段的比较
    AQUATOX水环境与水生态模型教程
  • 原文地址:https://blog.csdn.net/m0_51933492/article/details/127638761