python高级篇----网络编程与爬虫


没人知道未来会怎样,只要不是显而易见的蠢事,想到了那就去做吧。

1. 网络编程

1.1 基础

查看ip地址:

  • win: 打开cmd, 输入 ipconfig 回车
  • mac/linux: 打开 终端, 输入 ifconfig 回车

端口和端口号:

  • 端口的作用就是给运行的应用程序提供传输数据的通道。
  • 端口号的作用是用来区分和管理不同端口的,通过端口号能找到唯一个的一个端口。
  • 0-1023: 知名端口号,不要随意去用
  • 1024-65535: 随便用。

TCP 传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议

socket( 套接字 ) 负责网络中进程之间数据的传输,数据的搬运工。

cs 架构:client 客户端;server 服务器端
bs 架构: browser 浏览器; server 服务器

TCP服务器端程序的开发流程

  1. 创建TCP服务器端的socket对象
  2. 绑定端口号
  3. 设置监听
  4. 等待客户端的连接
  5. 一旦有客户端连接,接收消息
  6. 发送消息
  7. 关闭套接字
TCP网络应用程序的注意点介绍
  1. TCP 服务端程序必须绑定端口号,否则客户端找不到这个 TCP 服务端程序。
  2. listen 后的原套接字变为被动套接字,只负责接收新的客户端的连接请求,不能收发消息
  3. 当 TCP 客户端程序和 TCP 服务端程序连接成功后, TCP 服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字。
  4. 关闭 accept 返回的套接字意味着和这个客户端已经通信完毕
  5. 关闭 listen 后的被动套接字意味着服务端的套接字关闭了,会导致新的客户端不能连接服务端,但是之前已经接成功的客户端还能正常通信
  6. 当客户端的套接字调用 close 后,服务器端的 recv 会解阻塞,返回的数据长度为0,服务端可以通过返回数据的长度来判断客户端是否已经下线,反之服务端关闭套接字,客户端的 recv 也会解阻塞,返回的数据长度也为0

1.2 代码

服务端
import socket

# 1. 创建套接字对象 socket
"""
socket.AF_INET: IP地址的类型为 IPV4类型
socket.SOCK_STREAM:  使用的协议为TCP协议
默认值也是这个
"""
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# tcp_server_socket = socket.socket()

# 2. 绑定端口号
"""
bind() 接收元组(str(ip),int(端口号))
"""
tcp_server_socket.bind(("", 9999))

# 3. 设置监听
"""
listen() 监听的最大个数,一次最多可以有多少个客户端去连接服务器
如果没有客户端连接,那么程序会阻塞在这一行代码,  
"""
tcp_server_socket.listen(128)

# 4. 等待客户端的连接请求
"""
accept() 这个方法,有两个返回值。1是新的socket对象,用于服务客户端;2是元组(客户端的IP,客户端端口号)
"""
while True:
    client_socket, ip_port = tcp_server_socket.accept()
    print(f'客户端 {ip_port} 连接')
    # 5. 接收数据
    """
    新的socket对象接收客户端发的数据,使用recv(num) num 表示一次接收的字节数,该函数有返回值bytes类型。  
    """
    client_data = client_socket.recv(1024)
    print(f'客户端消息:{client_data.decode("gbk")}')

    # 6. 发送数据
    """
    发送消息使用  新的socket对象.send(),发送数据的类型应为bytes类型
    """
    client_socket.send("子陌".encode("gbk"))

    # 7. 关闭套接字对象
    client_socket.close()

# tcp_server_socket.close()
客户端
import socket
# 1. 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2. 连接服务器
client_socket.connect(('192.168.137.163', 9999))

# 3. 发送消息
client_socket.send("子陌".encode('gbk'))

# 4. 接收消息
data = client_socket.recv(1024)
print(f'服务器数据: {data.decode("gbk")}')

# 5. 关闭套接字
client_socket.close()

2. web服务

2.1 HTTP

HTTP 协议的全称是(HyperText Transfer Protocol),超文本传输协议。
传输 HTTP 协议格式的数据是基于 TCP 传输协议的,发送数据之前需要先建立连接。
HTTP规定了浏览器和 Web 服务器通信数据的格式,也就是说浏览器和web服务器通信需要使用http协议。

2.2 URL

URL的样子:

https://www.baidu.com/hello.html

URL的组成部分:

协议部分: https://、http://、ftp://
域名部分: www.baidu.com
资源路径部分: hello.html

域名就是IP地址的别名,它是用点进行分割使用英文字母和数字组成的名字,使用域名目的就是方便的记住某台主机IP地址。

2.3 HTTP请求报文

Get 请求报文

组成:请求行+请求头+空行

---- 请求行 ----
GET / HTTP/1.1\r\n  # GET请求方式 请求资源路径 HTTP协议版本
---- 请求头 -----
Host: www.baidu.com\r\n  # 服务器的主机地址和端口号,默认是80
Connection: keep-alive\r\n # 和服务端保持长连接
Upgrade-Insecure-Requests: 1\r\n # 让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50\r\n # 用户代理,也就是客户端的名称
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n # 可接受的数据类型
Accept-Encoding: gzip, deflate\r\n # 可接受的压缩格式
Accept-Language: zh-CN,zh;q=0.9\r\n #可接受的语言
Cookie: pgv_pvi=1246921728;\r\n # 登录用户的身份标识
---- 空行 ----
\r\n
Post请求报文

组成:请求行+请求头+空行+请求体

---- 请求行 ----
POST / HTTP/1.1\r\n # POST请求方式 请求资源路径 HTTP协议版本
---- 请求头 ----
Host: www.baidu.com\r\n # 服务器的主机地址和端口号,默认是80
Connection: keep-alive\r\n # 和服务端保持长连接
Content-Type: application/x-www-form-urlencoded\r\n  # 告诉服务端请求的数据类型
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50\r\n # 客户端的名称
---- 空行 ----
\r\n
---- 请求体 ---- 请求参数
username=hello&pass=hello 

2.4 HTTP响应报文

response响应报文

组成:响应行+响应头+空行+响应体

--- 响应行/状态行 ---
HTTP/1.1 200 OK\r\n # HTTP协议版本 状态码 状态描述
--- 响应头 ---
Server: Tengine\r\n # 服务器名称
Content-Type: text/html; charset=UTF-8\r\n # 内容类型
Transfer-Encoding: chunked\r\n # 发送给客户端内容不确定内容长度,发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。
Connection: keep-alive\r\n # 和客户端保持长连接
Date: Fri, 23 Nov 2018 02:01:05 GMT\r\n # 服务端的响应时间
--- 空行 ---
\r\n
--- 响应体 ---
<!DOCTYPE html><html lang=“en”></html> # 响应给客户端的数据

2.5 代码

import socket

tcp_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server_socket.bind(("",9999))
tcp_server_socket.listen(64)
client,ip_port=tcp_server_socket.accept()
print(f"客户端{ip_port}连接成功!")

client_data=client.recv(1024).decode("UTF-8")
request_line=client_data.split("\n")[0]
request_path=request_line.split(" ")[1]

# 响应行
response_line="HTTP/1.1 200 OK\r\n"
# 响应头 key:value
response_head="server: nginx\r\n"

# 响应体
f=""
if request_path=="/" or request_path=="/index.html":
    f=open("WebServer_html/index.html","r",encoding="UTF-8")
elif request_path == "/404.html":
    f = open("WebServer_html/404.html", "r", encoding="UTF-8")
elif request_path == "/gdp.html":
    f = open("WebServer_html/gdp.html", "r", encoding="UTF-8")
elif request_path == "/render.html":
    f = open("WebServer_html/render.html", "r", encoding="UTF-8")

response_body= f.read()


# 响应由 响应行 + 响应头 + 空行 + 响应体 构成
response=response_line+response_head+"\r\n"+response_body

client.send(response.encode("UTF-8"))
client.close()
tcp_server_socket.close()

3. Fastapi 与 uvicorn包

fastapi和uvicorn是快速构建web项目的py包,代码如下:

import fastapi
import uvicorn

# 1.创建api对象
app=fastapi.FastAPI()


# 2.定义函数
@app.get('/index.html')
def index():
    with open("WebServer_html/index.html","r",encoding="utf-8") as f:
        return fastapi.Response(content=f.read())


# fastapi的通用配置
@app.get("/images/{path}")
def image(path):
    with open(f"WebServer_html/images/{path}","rb") as f:
        # 读取图片用二进制,同时不能解码encoding
        return fastapi.Response(content=f.read())


@app.get("/{path}")
def Page(path):
    with open(f"WebServer_html/{path}","r",encoding="utf-8") as f:
        return fastapi.Response(content=f.read())


# 启动服务器
uvicorn.run(app,host="192.168.82.163",port=9999)

4. 进程与线程

4.1 进程概念

进程是操作系统进行资源分配的基本单位
进程之间不共享全局变量。
主进程会等待子进程执行完成以后程序再退出

设置守护主进程的目的是主进程退出子进程销毁,不让主进程再等待子进程去执行
设置守护主进程方式: 子进程对象.daemon = True
销毁子进程方式: 子进程对象.terminate()

4.2 进程代码

import multiprocessing as mp
import os
import time

list=[]
def set(num):
    print(f"set的进程号{os.getpid()}\t 它的父进程号{os.getppid()}")
    for i in range(num):
        time.sleep(0.05)
        list.append(i)
        print(f"set...{i}")

def get(num):
    print(f"get的进程号{os.getpid()}\t 它的父进程号{os.getppid()}")
    print(list)
    for i in range(num):
        time.sleep(0.05)
        print(f"get...{i}")

if __name__ == '__main__':
    num=5
    """
    Process([group[, target[, name[, args[, kwargs]]]]])
        group:指定进程组,目前只能使用None
        target:执行的目标任务名
        name:进程名字
        args:以元组方式给执行任务传参
        kwargs:以字典方式给执行任务传参
    """
    print(f"main主进程的进程号{os.getpid()}")
    process_1=mp.Process(target=set,args=(num,))
    process_2=mp.Process(target=get,kwargs={"num":num})
    process_1.start()
    #  销毁子进程
    # process_1.terminate()
    process_1.join()
    # 设置守护主进程,主进程退出子进程直接销毁,子进程的生命周期依赖与主进程
    # process_2.daemon = True
    process_2.start()       # list=[],表示
    print("-----主进程结束了-----")

4.3 线程概念

线程是cpu调度的基本单位
线程之间执行是无序的
主线程会等待所有的子线程执行结束再结束
线程之间共享全局变量
线程之间共享全局变量数据出现错误问题(线程同步: 保证同一时刻只能有一个线程去操作全局变量)

互斥锁:

# -----互斥锁:-----
lock=threading.Lock()
# 线程锁上
lock.acquire()
# 线程释放
lock.release()

# -----线程同步:-----
s_thread.join()
p_thread.join()

4.4 线程代码

import threading

all_num=0
def set(num):
    global all_num
    for i in range(num):
        # 线程锁上
        lock.acquire()
        all_num+=1
        # 线程释放
        lock.release()
    print("set:",all_num,sep="  ")

def get():
    global all_num
    for i in range(num):
        # 线程锁上
        lock.acquire()
        all_num+=1
        # 线程释放
        lock.release()

    print("get:",all_num,sep="  ")

if __name__ == '__main__':
    # 线程锁
    lock=threading.Lock()
    num=1000000
    """
    Thread([group [, target [, name [, args [, kwargs]]]]])
        group: 线程组,目前只能使用None
        target: 执行的目标任务名
        args: 以元组的方式给执行任务传参
        kwargs: 以字典方式给执行任务传参
        name: 线程名,一般不用设置
"""
    s_thread=threading.Thread(target=set,kwargs={"num":num})
    p_thread=threading.Thread(target=get)
    # 守护线程
    # s_thread.daemon=True
    # p_thread.setDaemon(True)
    s_thread.start()
    # s_thread.join()
    p_thread.start()
    # p_thread.join()

    print("main:",all_num,sep="  ")

5. 正则表达式

5.1 匹配单字符

在这里插入图片描述

import re
str="Dut^zimo520 love dut and more love python or java!"
# match 都是从开头开始匹配,不对就返回none
# a=re.match(r"d.t",str)                    # 匹配失败:None
# a=re.match(r"[a-zA-Z]ut\^zimo\d\d\d",str)    # 匹配成功:Dut^zimo520
a=re.match(r"\Du.\Wzi\S\w520\s\w",str)      # 匹配成功:Dut^zimo520 l

if a:
    print(f"匹配成功:{a.group()}")
else:
    print(f"匹配失败:{a}")

5.2 匹配多个字符

在这里插入图片描述

import re
str="Dut^zimo520 love dut and more love python or java!"
# Python⾥数量词默认是贪婪的(在少数语⾔⾥也可能是默认⾮贪婪),总是尝试匹配尽可能多的字符
# a=re.match(r".*love",str)           # 匹配成功:Dut^zimo520 love dut and more love
# a=re.match(r".*?love",str)          # 匹配成功:Dut^zimo520 love
# a=re.match(r"\D{6,10}520",str)      # 匹配成功:Dut^zimo520
a=re.match(r"\w{3}.*dut",str)       # 匹配成功:Dut^zimo520 love dut

if a:
    print(f"匹配成功:{a.group()}")
else:
    print(f"匹配失败:{a}")

5.3 匹配开头和结尾

在这里插入图片描述

import re
str1="!a!bc"
str2="ab!c!"
str3="!abc!"
# a=re.findall(r"^\W.*?\W$",str1)     # 匹配失败:[]
# a=re.findall(r"^\W.*?\W$",str2)     # 匹配失败:[]
# a=re.findall(r"^\W.*?\W",str1)      # 匹配成功:['!a!']
# a=re.findall(r"\W.*?\W$",str2)      # 匹配成功:['!c!']
a=re.findall(r"^\W.*?\W$",str3)     # 匹配成功:['!abc!']

if a:
    print(f"匹配成功:{a}")
else:
    print(f"匹配失败:{a}")

5.4 匹配分组

在这里插入图片描述

import re
list=["abc","acb","bac","bca","cab,""cba"]

for i in list:
    a=re.findall(r"abc|cba",i)
    if a:
        print(f"匹配成功:{a}")      # ['abc']和['cba']

url="<h6>您的浏览器版本太低,将不能正常使用百度翻译!</h6>" \
    "<h5>您的浏览器版本太高,非常能使用百度翻译!</h5>"
url1="<h6></h6><h6><h5></h5></h5>"
a=re.match(r"<(h\d>).*<(/\1)",url)
# 匹配成功:<h6>您的浏览器版本太低,将不能正常使用百度翻译!</h6>
a=re.match(r"(<h\d>).*(\1)",url)    # 这里的(\1)是前面的<h6> 而不是<h\d>
# 匹配失败:None
a=re.match(r"(<h\d>).*(\1)",url1)
# 匹配成功:<h6></h6><h6>
a=re.match(r"(?P<aa><h\d>).*(?P=aa)",url1)
# 匹配成功:<h6></h6><h6>

if a:
    print(f"匹配成功:{a.group()}")
else:
    print(f"匹配失败:{a}")

5.5 re. 函数

  1. compile 用于编译正则表达式,生成一个正则表达式( Pattern )对象,供re其他函数使用。
  2. match 尝试从字符串的起始位置匹配,如果不是起始位置匹配成功的话,match()就返回none。匹配成功re.match方法返回一个匹配的对象。
  3. search 匹配整个字符串,直到找到一个匹配,与match不同。
  4. findall 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配,则返回空列表。注意: match 和 search 是匹配一次 findall 匹配所有。
  5. sub 是substitute的所写,表示替换,将匹配到的数据进⾏替换。
  6. split 根据匹配进⾏切割字符串,并返回⼀个列表。
import re
str="<h1>你是38……&38是你</h1><h2>1314是你^^你是1314</h2>"
a=re.compile(r'<h1>(.*)</h1><h2>(.*)</h2>')
result=re.search(a,str)
for i in range(3):
    print(result.group(i))
"""
<h1>你是38……&38是你</h1><h2>1314是你^^你是1314</h2>
你是38……&38是你
1314是你^^你是1314
"""
a=re.findall(a,str)  # 注意每次查找到的两项是放在元组里
print(a)        # [('你是38……&38是你', '1314是你^^你是1314')]

a=re.sub(r"<h\d>|</h\d>","",str)	# 还可以有参数count=num,表示替换num个
print(a)        # 你是38……&38是你1314是你^^你是1314

a=re.split(r"<h\d>|</h\d>",str)    # 切了4刀,有5份数据 
print(a)    # ['', '你是38……&38是你', '', '1314是你^^你是1314', '']

6. 爬虫

6.1 概念

爬虫本质,就是用于去 模拟浏览器发送请求,获取响应,按照一定的规则, 自动的从互联网上获取数据的程序。搜索引擎的本质 就是 爬虫。

6.2 爬图片代码

import re
import time
import random
import requests

# 1.准备url地址,
url="https://www.meitu131.com/e/search/result/index.php?page=0&searchid=187"
    # 提前写正则
image_re=re.compile(r"<img src=\"(https:.*?)\"")
user_agent=[
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/61.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.63"
]
# 随机选择用户代理,提高爬虫效率
header={"user-agent": random.choice(user_agent)}

# 2.发送请求获取响应
def get_data(url):
    # decode() 默认使用的是 utf-8编码
    mm_images=requests.get(url,headers=header).content.decode()
# 3.提取数据
    return re.findall(image_re,mm_images)

# 4.保存数据
def save_data(list):
    for i,urlmm in enumerate(list):
        # 因为使用随机代理,所以睡眠时间可以短
        time.sleep(0.2)
        mm_image=requests.get(urlmm,headers=header).content
        with open(f"WebServer_html/imagemn/{i}.jpg","wb") as f:
            f.write(mm_image)
        print(f"爬好了{i}张了(#^.^#)")

save_data(get_data(url))

6.3 BeautifulSoup

html代码

下文爬取的数据均来自该html

<!DOCTYPE html>
<!--STATUS OK-->
<html>
 <head>
  <meta content="text/html;charset=utf-8" http-equiv="content-type"/>
  <meta content="IE=Edge" http-equiv="X-UA-Compatible"/>
  <meta content="always" name="referrer"/>
  <link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>
  <title>
   百度一下,你就知道 </title>
 </head>
 <body link="#0000cc">
  <div id="wrapper">
   <div id="head">
    <div class="head_wrapper">
     <div id="u1">
      <a class="mnav" href="http://news.baidu.com" name="tj_trnews">
       新闻 </a>
      <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">
       hao123 </a>
      <a class="mnav" href="http://map.baidu.com" name="tj_trmap">
       地图 </a>
      <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">
       视频 </a>
      <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">
       贴吧 </a>
      <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">
       更多产品 </a>
     </div>
     <div id="u2" class="centerdiv" style="margin-top:0px">
      <span>@2022Baidu</span>
      <a name="zimo"> 使用百度前必读  </a>
      <a name="zimo"> 意见反馈  </a>
      <span> www.baidu.com </span>
      <span class="aaa"> 对对对 </span>
      <a name="zimo"> 你是头大笨猪 </a>
     </div>
    </div>
   </div>
  </div>
 </body>
</html>
BeautifulSoup的基础操作
from bs4 import BeautifulSoup

with open("WebServer_html/baidu.html","r",encoding="utf-8") as f:
    a=f.read()
bs=BeautifulSoup(a,"html.parser")

# 让html文变得漂亮,易读(添加了缩进)
print(bs.prettify())

print(bs.title)
print(bs.title.name)    # 获取title标签名字
print(bs.title.string)  # 获取title标签里的内容
print(bs.head)          # 获得head标签的全部内容
print(bs.div)           # 获得第一个div标签的内容
print(bs.div["id"])         # 获取第一个div标签的id的值
print(bs.div.get("id"))     # 与前者是一致的
print(bs.div.div.div.div.a)     # 获取内部标签
find_all()函数
# print(bs.find_all("span"))                    # 获取所有span标签的内容
# print(bs.find_all(name="a"))                  # 获取标签名="a"的所有内容
# print(bs.find_all(id="u2"))                   # 获取id="u2"的所有内容
# print(bs.find_all(attrs = {'name':'zimo'}))   # 获取标签中属性名为"zimo"的所有内容

# for i in bs.find_all("a"):      # 获取所有a标签中的href内容,标签里没有的则返回None
#     print(i.get("href"))
#
# for item in bs.find_all("a"):   # 获取所有的a标签的文本值
#     print(item.get_text())


# print(bs.find_all(text=re.compile(r'头')))   # 获取标签内容为'头'

6.4 多进程/线程爬虫

利用多线程/线程爬虫可以有效的缩短爬取时间。

网页代码
<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="icon" href="data:;base64,=">
    <meta charset="UTF-8">
    <title>2020年世界GDP排名</title>
    <style type="text/css">
       .t1
        {
            clear: both;
            border: 1px solid #c9dae4;
        }
        .t1 tr th
        {
            color: #0d487b;
            background: #f2f4f8;
            line-height: 28px;
            border-bottom: 1px solid #9cb6cf;
            border-top: 1px solid #e9edf3;
            font-weight: normal;
            text-shadow: #e6ecf3 1px 1px 0px;
            padding-left: 5px;
            padding-right: 5px;
        }
        .t1 tr td
        {
            border-bottom: 1px solid #e9e9e9;
            padding-bottom: 5px;
            padding-top: 5px;
            color: #444;
            border-top: 1px solid #FFFFFF;
            padding-left: 5px;
            padding-right: 5px;
            word-break: break-all;
        }
        tr td
        {
            background: #ecf6fc; /*这行将给所有的tr加上背景色*/
            text-align: center;
        }
    </style>
<!--    <link rel="icon" href="data:;base64,=">-->
</head>
<body>
<div style="text-align:center;"><h1>2020年世界GDP排名</h1></div>
<table width="100%" id="ListArea" border="0" class="t1" align="center" cellpadding="0"
        cellspacing="0">
          <tr>
            <th><font><font><font><font>GDP总量</font></font>排名</font></font></th>
            <th><font><font>国家/地区</font></font></th>
            <th><font><font>单位亿美元</font></font></th>
            <th><font><font><font>GDP总量</font>(人民币亿元)</font></font></th>
            <th><font><font>GDP总量(人民币亿元)</font></font></th>
            <th><font><font>地区</font></font></th>
          </tr>
          <tr style="">
            <td class="rank" ><font><font>排名第1</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>美国</font></a></td>
            <td class="value"><font>$218463.3<font>亿</font></font></td>
            <td class="rank_prev"><font>¥1422196.083亿元</font></td>
            <td>壹佰肆拾贰<font color="red"></font>贰仟壹佰玖拾陆<font color="red">亿元</font></td>
            <td class="area"><font><font>美洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第2</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>中国</font></a></td>
            <td class="value"><font>$155518.9<font>亿</font></font></td>
            <td class="rank_prev"><font>¥1012428.039亿元</font></td>
            <td>壹佰零壹<font color="red"></font>贰仟肆佰贰拾捌<font color="red">亿元</font></td>
            <td class="area"><font><font>亚洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第3</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>日本</font></a></td>
            <td class="value"><font>$52797.7<font>亿</font></font></td>
            <td class="rank_prev"><font>¥343713.027亿元</font></td>
            <td>叁拾肆<font color="red"></font>叁仟柒佰壹拾叁<font color="red">亿元</font></td>
            <td class="area"><font><font>亚洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第4</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>德国</font></a></td>
            <td class="value"><font>$42119<font>亿</font></font></td>
            <td class="rank_prev"><font>¥274194.69亿元</font></td>
            <td>贰拾柒<font color="red"></font>肆仟壹佰玖拾肆<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第5</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>印度</font></a></td>
            <td class="value"><font>$32248.7<font>亿</font></font></td>
            <td class="rank_prev"><font>¥209939.037亿元</font></td>
            <td>贰拾<font color="red"></font>玖仟玖佰叁拾玖<font color="red">亿元</font></td>
            <td class="area"><font><font>亚洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第6</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>法国</font></a></td>
            <td class="value"><font>$29749<font>亿</font></font></td>
            <td class="rank_prev"><font>¥193665.99亿元</font></td>
            <td>壹拾玖<font color="red"></font>叁仟陆佰陆拾伍<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第7</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>英国</font></a></td>
            <td class="value"><font>$28037.9<font>亿</font></font></td>
            <td class="rank_prev"><font>¥182526.729亿元</font></td>
            <td>壹拾捌<font color="red"></font>贰仟伍佰贰拾陆<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第8</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>巴西</font></a></td>
            <td class="value"><font>$24038.7<font>亿</font></font></td>
            <td class="rank_prev"><font>¥156491.937亿元</font></td>
            <td>壹拾伍<font color="red"></font>陆仟肆佰玖拾壹<font color="red">亿元</font></td>
            <td class="area"><font><font>美洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第9</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>意大利</font></a></td>
            <td class="value"><font>$21602<font>亿</font></font></td>
            <td class="rank_prev"><font>¥140629.02亿元</font></td>
            <td>壹拾肆<font color="red"></font>零陆佰贰拾玖<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第10</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>加拿大</font></a></td>
            <td class="value"><font>$19071.8<font>亿</font></font></td>
            <td class="rank_prev"><font>¥124157.418亿元</font></td>
            <td>壹拾贰<font color="red"></font>肆仟壹佰伍拾柒<font color="red">亿元</font></td>
            <td class="area"><font><font>美洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第11</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>韩国</font></a></td>
            <td class="value"><font>$17379.6<font>亿</font></font></td>
            <td class="rank_prev"><font>¥113141.196亿元</font></td>
            <td>壹拾壹<font color="red"></font>叁仟壹佰肆拾壹<font color="red">亿元</font></td>
            <td class="area"><font><font>亚洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第12</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>俄罗斯</font></a></td>
            <td class="value"><font>$16527.3<font>亿</font></font></td>
            <td class="rank_prev"><font>¥107592.723亿元</font></td>
            <td>壹拾<font color="red"></font>柒仟伍佰玖拾贰<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr style="">
            <td class="rank"><font><font>排名第13</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>澳大利亚</font></a></td>
            <td class="value"><font>$16314.4<font>亿</font></font></td>
            <td class="rank_prev"><font>¥106206.744亿元</font></td>
            <td>壹拾<font color="red"></font>陆仟贰佰零陆<font color="red">亿元</font></td>
            <td class="area"><font><font>大洋州国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第14</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>西班牙</font></a></td>
            <td class="value"><font>$15336.1<font>亿</font></font></td>
            <td class="rank_prev"><font>¥99838.011亿元</font></td>
            <td><font color="red"></font>玖仟捌佰叁拾捌<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第15</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>墨西哥</font></a></td>
            <td class="value"><font>$13929.2<font>亿</font></font></td>
            <td class="rank_prev"><font>¥90679.092亿元</font></td>
            <td><font color="red"></font>零陆佰柒拾玖<font color="red">亿元</font></td>
            <td class="area"><font><font>美洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第16</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>印度尼西亚</font></a></td>
            <td class="value"><font>$12908.4<font>亿</font></font></td>
            <td class="rank_prev"><font>¥84033.684亿元</font></td>
            <td><font color="red"></font>肆仟零叁拾叁<font color="red">亿元</font></td>
            <td class="area"><font><font>亚洲国家</font></font></td>
          </tr>
          <tr  tyle="">
            <td class="rank"><font><font>排名第17</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>土耳其</font></a></td>
            <td class="value"><font>$10189.1<font>亿</font></font></td>
            <td class="rank_prev"><font>¥66331.041亿元</font></td>
            <td><font color="red"></font>陆仟叁佰叁拾壹<font color="red">亿元</font></td>
            <td class="area"><font><font>亚洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第18</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>荷兰</font></a></td>
            <td class="value"><font>$9519.34<font>亿</font></font></td>
            <td class="rank_prev"><font>¥61970.9034亿元</font></td>
            <td><font color="red"></font>壹仟玖佰柒拾<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第19</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>阿根廷</font></a></td>
            <td class="value"><font>$7650.96<font>亿</font></font></td>
            <td class="rank_prev"><font>¥49807.7496亿元</font></td>
            <td><font color="red"></font>玖仟捌佰零柒<font color="red">亿元</font></td>
            <td class="area"><font><font>美洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第20</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>沙特阿拉伯</font></a></td>
            <td class="value"><font>$7609.9<font>亿</font></font></td>
            <td class="rank_prev"><font>¥49540.449亿元</font></td>
            <td><font color="red"></font>玖仟伍佰肆拾<font color="red">亿元</font></td>
            <td class="area"><font><font>亚洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第21</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>瑞士</font></a></td>
            <td class="value"><font>$7497.32<font>亿</font></font></td>
            <td class="rank_prev"><font>¥48807.5532亿元</font></td>
            <td><font color="red"></font>捌仟捌佰零柒<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第22</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>瑞典</font></a></td>
            <td class="value"><font>$6509.2<font>亿</font></font></td>
            <td class="rank_prev"><font>¥42374.892亿元</font></td>
            <td><font color="red"></font>贰仟叁佰柒拾肆<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第23</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>波兰</font></a></td>
            <td class="value"><font>$6327.86<font>亿</font></font></td>
            <td class="rank_prev"><font>¥41194.3686亿元</font></td>
            <td><font color="red"></font>壹仟壹佰玖拾肆<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第24</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>中国台湾</font></a></td>
            <td class="value"><font>$6252.46<font>亿</font></font></td>
            <td class="rank_prev"><font>¥40703.5146亿元</font></td>
            <td><font color="red"></font>零柒佰零叁<font color="red">亿元</font></td>
            <td class="area"><font><font>亚洲</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第25</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>尼日利亚</font></a></td>
            <td class="value"><font>$5888.41<font>亿</font></font></td>
            <td class="rank_prev"><font>¥38333.5491亿元</font></td>
            <td><font color="red"></font>捌仟叁佰叁拾叁<font color="red">亿元</font></td>
            <td class="area"><font><font>非洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第26</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>比利时</font></a></td>
            <td class="value"><font>$5684.22<font>亿</font></font></td>
            <td class="rank_prev"><font>¥37004.2722亿元</font></td>
            <td><font color="red"></font>柒仟零肆<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第27</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>泰国</font></a></td>
            <td class="value"><font>$5271.29<font>亿</font></font></td>
            <td class="rank_prev"><font>¥34316.0979亿元</font></td>
            <td><font color="red"></font>肆仟叁佰壹拾陆<font color="red">亿元</font></td>
            <td class="area"><font><font>亚洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第28</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>奥地利</font></a></td>
            <td class="value"><font>$4767.54<font>亿</font></font></td>
            <td class="rank_prev"><font>¥31036.6854亿元</font></td>
            <td><font color="red"></font>壹仟零叁拾陆<font color="red">亿元</font></td>
            <td class="area"><font><font>欧洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第29</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>伊朗</font></a></td>
            <td class="value"><font>$4556.46<font>亿</font></font></td>
            <td class="rank_prev"><font>¥29662.5546亿元</font></td>
            <td><font color="red"></font>玖仟陆佰陆拾贰<font color="red">亿元</font></td>
            <td class="area"><font><font>亚洲国家</font></font></td>
          </tr>
          <tr  style="">
            <td class="rank"><font><font>排名第30</font></font></td>
            <td>&nbsp;&nbsp;<a href=""><font>阿闻酋</font></a></td>
            <td class="value"><font>$4459.15<font>亿</font></font></td>
            <td class="rank_prev"><font>¥29029.0665亿元</font></td>
            <td><font color="red"></font>玖仟零贰拾玖<font color="red">亿元</font></td>
            <td class="area"><font><font>亚洲国家</font></font></td>
          </tr>
      </table>
</body>
</html>
爬虫代码
import re,requests,fastapi,uvicorn
from bs4 import BeautifulSoup
import multiprocessing as mp


def Server():
    app=fastapi.FastAPI()

    @app.get("/gdp.html")
    def Gdp():
        with open("WebServer_html/gdp.html","r",encoding="utf-8") as f:
            return fastapi.Response(content=f.read())

    uvicorn.run(app,host="192.168.82.163",port=9999)


def getGdp():
    url="http://192.168.82.163:9999/gdp.html"
    country=re.compile(r'<a href=""><font>(.*?)</font></a>')
    money=re.compile(r'<td class="value"><font>\W(.*?)<font>亿</font></font></td>')

    html=requests.get(url).content.decode("utf-8")
    html=BeautifulSoup(html,"html.parser").body.table
    html=str(html)

    country_list=re.findall(country,html)
    money_list=re.findall(money,html)
    all_list=list(zip(country_list,money_list))

    with open('WebServer_html/gdp.txt',"a",encoding="utf-8") as f:
        for i in all_list:
            f.write(str(i))
            f.write("\n")

if __name__ == '__main__':
    Pserver=mp.Process(target=Server)
    Pgdb=mp.Process(target=getGdp)
    Pserver.start()
    Pserver.join()
    Pgdb.start()

7. json文件处理

在这里插入图片描述

7.1 loads() 和 load() 函数

在这里插入图片描述

import json

# load() 从一个文件读取JSON类型的数据,将其转换为Python字典
with open("stu.json","r",encoding="utf-8") as f:
    json_load=json.load(f)
    print(json_load,"f类型:"+str(type(f)),sep="\t\t")

# loads() 解析一个有效的JSON字符串,将其转换为Python字典
with open("stu.json","r",encoding="utf-8") as f:
    f=f.read()
    json_loads=json.loads(f)
    print(json_loads,"f类型:"+str(type(f)),sep="\t\t")

7.2 dumps() 和 dump() 函数

dictionary ={
  "name": "子陌",
  "age": 520,
  "uni": "dut",
  "habby": {"sport": ["足球","乒乓球","羽毛球"],
            "fun": ["lol","pubg","csgo"]
  }
}

# dumps() 将Python对象转换成json字符串(一般是字典)
print(json.dumps(dictionary,ensure_ascii=False))

# dump():将Python对象写入json文件
with open("stu_test.json","w",encoding="utf-8") as f:
  json.dump(dictionary,f,ensure_ascii=False,indent=4)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值