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

目录

传统TCP服务器端搭建 

传统TCP客户端搭建 

引入非阻塞的TCP服务器

爬虫实战:

使用socket建造一个服务端

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


传统TCP服务器端搭建 

# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
import socket

# 1.服务器对象         socket.AF_INET:使用IPV4;  socket.SOCK_STREAM:使用socket套接字。
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.绑定IP和端口号
server.bind(("127.0.0.1",8080))

# 3.监听  设置接收数
server.listen(128)
print('服务器开启', 8080)

# 4.处理连接
# accept()理解就是三次握手建立连接。
# accept是一个阻塞的方法(你不来我就不动!),等待连接,每建立一个连接就会创建一个单独的通道。
# conn:通道参数;addr:通道地址(客户端连接服务端的IP和端口号,这个客户端的端口号是随机生成的!)。

new_cli, addr = server.accept()

# 打印一下ip和端口号的类型
print('来自一个新的连接', addr, type(addr))

# 5.设置接收数据的大小

data = new_cli.recv(1024)
print(data)
# 6.关闭这个连接的通道
new_cli.close()
# 关闭整个服务器
server.close()

传统TCP客户端搭建 

# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
import socket

# 建立服务器对象      通过打印这个client服务器对象可知:默认使用的是IPV4,协议是TCP。
client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 指定服务器的ip和端口号
client.connect(('127.0.0.1',8080))
# 发送数据给服务器
client.send(b'hello server')
# 指定发送给服务器的文件大小
data = client.recv(1024)
print(data)
  • 传统TCP服务器中.accept()方法是阻塞的,会造成阻塞形成网络等待
  • 在TCP服务器中使用协程,引入非阻塞,解决服务器和客户端两个线程的切换问题

引入非阻塞的TCP服务器

import socket
import threading


def handle_func(new_sock):
    while True:
        data = new_sock.recv(4)     # 接收数据
        print(data)
        if data is None:
            break
    new_sock.close()

while 1:
    # 服务器对象         socket.AF_INET:使用IPV4;  socket.SOCK_STREAM:创建一个socket套接字。
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定服务器
    server.bind(("127.0.0.1", 8000))
    # 监听
    server.listen(128)
    print('服务器开启', 8000)

    # accept是一个阻塞的方法(你不来我就不动!),等待连接,每建立一个连接就会创建一个单独的通道。
    # conn:通道参数;addr:通道地址(客户端连接服务端的IP和端口号,这个客户端的端口号是随机生成的!)。
    new_cli, addr = server.accept()
    # 打印一下ip的类型
    print('来自一个新的连接', addr, type(addr))
    server.setblocking(False)  # 设置套接字为非阻塞     找epoll使用  解决网络的等待问题
    # 注意:协程要依附于线程!
    task = threading.Thread(target=handle_func, args=(new_cli,))
    task.start()

爬虫实战:

使用socket建造一个服务端

import socket
# 服务器对象
server = socket.socket()
'''
等同于:server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.AF_INET:使用IPV4;
socket.SOCK_STREAM:创建一个socket套接字。
'''

# 1.绑定服务器
server.bind(("0.0.0.0",8800))   #0.0.0.0是允许所有人来访问;8800是端口号

# 2.监听
server.listen(5)

while True:
    # 3.等待连接
    # accept是一个阻塞的方法(你不来我就不动!),等待连接,每建立一个连接就会创建一个单独的通道。
    # conn:通道参数;addr:通道地址。
    conn,addr=server.accept()

    # 4.接收数据
    data=conn.recv(1024)
    print(data)

    response="HTTP/1.1 200 OK\r\nContent-Type: text/html;charset=utf-8;\r\n\r\n<h1 style='color:black'>我很帅!<h1>"

    # 5.发送数据
    conn.send(response.encode())
    print("已经响应")

# 6.关闭
server.close()

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

import socket

# 建立服务器对象      通过打印这个client服务器对象可知:默认使用的是IPV4,协议是TCP。
client=socket.socket()

# 1.建立连接
client.connect(("www.baidu.com",80))

# 构造请求报文
data=b"GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n"

# 2.发送请求
client.send(data)
res=b""

# 3.接收数据
temp=client.recv(4096)
while temp:
    print("*"*50)
    res += temp
    temp = client.recv(4096)
    print(temp.decode())

# 4.断开连接
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}</style></head><body><div id="wrapper" class="wrapper_new"><div id="head"><div id="s-top-left" class="s-top-left s-isindex-wrap"><a href="//news.baidu.com/" target="_blank" class="mnav c-font-normal c-color-t">新闻</a><a href="//www.hao123.com/" target="_blank" class="mnav c-font-normal c-color-t">hao123</a><a href="//map.baidu.com/" target="_blank" class="mnav c-font-normal c-color-t">地图</a><a href="//live.baidu.com/" target="_blank" class="mnav c-font-normal c-color-t">直播</a><a href="//haokan.baidu.com/?sfrom=baidu-top" target="_blank" class="mnav c-font-normal c-color-t">视频</a><a href="//tieba.baidu.com/" target="_blank" class="mnav c-font
**************************************************
-normal c-color-t">贴吧</a><a href="//xueshu.baidu.com/" target="_blank" class="mnav c-font-normal c-color-t">学术</a><div class="mnav s-top-more-btn"><a href="//www.baidu.com/more/" name="tj_briicon" class="s-bri c-font-normal c-color-t" target="_blank">更多</a></div></div><div id="u1" class="s-top-right s-isindex-wrap"><a class="s-top-login-btn c-btn c-btn-primary c-btn-mini lb" style="position:relative;overflow:visible" name="tj_login" href="//www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1">登录</a></div><div id="head_wrapper" class="head_wrapper s-isindex-wrap s-ps-islite"><div class="s_form"><div class="s_form_wrapper"><div id="lg" class="s-p-top"><img hidefocus="true" id="s_lg_img" class="index-logo-src" src="//www.baidu.com/img/flexible/logo/pc/index.png" width="270" height="129" usemap="#mp"><map name="mp"><area style="outline:0" hidefocus="true" shape="rect" coords="0,0,270,129" href="//www.baidu.com/s?wd=%E7%99%BE%E5%BA%A6%E7%83%AD%E6%90%9C&amp;sa=ire_dl_gh_logo_texing&amp;rsv_dl=igh_logo_pcs" target="_blank" title="点击一下,了解更多"></map></div><a href="//www.baidu.com/" id="result_logo"></a><form id="form" name="f" action="//www.baidu.com/s" class="fm"><input type="hidden" name="ie" value="utf-8"> <input type="hidden" name="f" value="8"> <input type="hidden" name="rsv_bp" value="1"> <input type="hidden" name="rsv_idx" value="1"> <input type="hidden" name="ch" value=""> <input type="hidden" name="tn" value="baidu"> <input type="hidden" name="bar" value=""> <span class="s_ipt_wr quickdelete-wrap"><input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off"> </span><span class="s_btn_wr"><input type="submit" id="su" value="百度一下" class="bg s_btn"> </span><input type="hidden" name="rn" value=""> <input type="hidden" name="fenlei" value="256"> <input type="hidden" name="oq" value=""> <input type="hidden" name="rsv_pq" value="b9ff093e0000e419"> <input type="hidden" name="rsv_t" value="3635FYbdbC8tlWmudZmYaUnaucNe+RzTzNEGqg/JuniQU10WL5mtMQehIrU"> <input type="hidden" name="rqlang" value="cn"> <input type="hidden" name="rsv_enter" value="1"> <input type="hidden" name="rsv_dl" value="ib"></form></div></div></div><div id="bottom_layer" class="s-bottom-layer s-isindex-wrap"><div class="s-bottom-layer-content"><p class="lh"><a class="text-color" href="//home.baidu.com/" target="_blank">关于百度</a></p><p class="lh"><a class="text-color" href="//ir.baidu.com/" target="_blank">About Baidu</a></p><p class="lh"><a class="text-color" href="//www.baidu.com/duty" target="_blank">使用百度前必读</a></p><p class="lh"><a class="text-color" href="//help.baidu.com/" target="_blank">帮助中心</a></p><p class="lh"><a class="text-color" href="//www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000001" target="_blank">京公网安备11000002000001号</a></p><p class="lh"><a class="text-color" href="//beian.miit.gov.cn/" target="_blank">京ICP证030173号</a></p><p class="lh"><span id="year" class="text-color"></span></p><p class="lh"><span class="text-color">互联网药品信息服务资格证书 (京)-经营性-2017-0020</span></p><p class="lh"><a class="text-color" href="//www.baidu.com/licence/" target="_blank">信息网络传播视听节目许可证 0110516</a></p></div></div></div></div><script type="text/javascript">var date=new Date,year=date.getFullYear();document.getElementById("year").innerText="©"+year+"
Baidu "</script></body></html>

爬取图片待补充。。。 

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

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

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

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

猜你喜欢

转载自blog.csdn.net/m0_51933492/article/details/127638761
今日推荐