• python 笔记(3)——request、爬虫、socket、多线程


    目录

    1、使用requests发送http请求

    1-1)发送get请求

    1-2)发送 post 请求

    1-3)发送 get 请求下载网络图片

    1-4)使用 post 上传文件

    1-5)自动维护 session 的方式

    2、使用 os.popen 执行cmd命令

    3、基于 beautifulSoup 的爬虫

    3-1)初始化解析器

    3-2)查找页面元素

    3-2-1)find、findAll

    3-2-2)使用css选择器来进行查找

    4、socket 通信

    5、多线程

    多线程改进 socket ,一对多通信:


    1、使用requests发送http请求

    > pip install requests                        安装该模块

    import requests

    1-1)发送get请求

    1. params = {}
    2. headers = {}
    3. resq = requests.get('https://www.baidu.com', params=params, headers=headers)
    4. resq.encoding = 'utf-8'
    5. # print(resq.text) # 返回的数据 html内容
    6. print(resq.headers) # 响应头
    7. # print(resq.content) # 返回响应的内容
    8. # print(resq.status_code) # 返回状态码 200

    1-2)发送 post 请求

    1. data = {'name':'张三','age':23,'gender':'男'}
    2. headers = {}
    3. req = requests.post('http://www.test.cn', data=data,headers=headers)
    4. print(req.text)
    5. print(req.headers)

    1-3)发送 get 请求下载网络图片

    1. resq = requests.get('https://p.qqan.com/up/2018-5/2018050911304322378.jpg')
    2. with open('./img_download2.png','wb') as f:
    3. f.write(resq.content) # resq.content 得到的是二进制流;resq.text 得到的是文本型的响应

    1-4)使用 post 上传文件

    1. # 文件上传 先登录,再上传
    2. cookie = resq.cookies # 获取等录后的cookie
    3. file = {'file':open('G:/test_img.xls', 'rb')}
    4. data = {'name':'testFile'}
    5. res = requests.post(url='http://target.cn', data=data, files=file, cookies=cookie)
    6. print(res.status_code)
    7. print(res.text)

    1-5)自动维护 session 的方式

            利用 requests.session() 获取到 session 对象,使用 session 对象发送请求,可以维护cookies 和 session,不必自己操作。

    1. session = requests.session()
    2. data = {'user':'admin', password:'123112233'}
    3. req = session.post('http://denglu.cn',data=data) # 登录
    4. file = {'file':open('G:/test_img.xls', 'rb')}
    5. data = {'name':'testFile'}
    6. res = session.post(url='http://target.cn',data=data,files=file) # 上传文件
    7. print(res.status_code)
    8. print(res.text)

    2、使用 os.popen 执行cmd命令

    1. import os
    2. ipconfig = os.popen('ipconfig').read() # 使用popen不会直接输出,把执行结果赋值给变量
    3. print(ipconfig)

    1. # os.popen('notepad.exe') # 打开记事本
    2. os.popen('explorer.exe E:\\') # 打开资源管理器并定位到 E 盘目录下

    3、基于 beautifulSoup 的爬虫

    > pip install bs4

    > pip install wheel

    yum install -y epel-release libxslt-devel libxml2-devel openssl-devel

    > pip install lxml==4.6.2                                安装解析器lxml

    解析器可以使用:html.parser、lxml、xml、html5lib 

    1. from bs4 import BeautifulSoup
    2. import requests
    3. # 淘宝
    4. res = requests.get('https://www.taobao.com/')
    5. res.encoding = 'utf8'

    3-1)初始化解析器

    1. # html是 bs4.BeautifulSoup 实例,是经过解析的 HTML 代码
    2. html = BeautifulSoup(res.text, 'lxml')

    3-2)查找页面元素

    1. print(html.head.title) # 淘宝
    2. print(html.head.title.string) # 淘宝
    3. print(html.div) # 获取到的是文档中的第一个div元素及其所有子元素
    4. print(html.div.div) # 获取到文档中的第一个div元素下的第一个div子元素

    查找页面元素的通用方法:find、findAll、select
    1、find、findAll 根据标签、属性等进行查找(find 是查找第一个匹配的;findAll是查找所有,会以列表的形式返回)
    2、select 利用css选择器来进行查找:div  #id  .class

    3-2-1)find、findAll

    使用标签名来查找

    1. links = html.findAll('a') # 使用标签名来查找所有的链接
    2. for link in links:
    3. print(link['href'])

    使用类名 class 来查找

    1. # 使用类名来进行查找 注意是 class_
    2. hots = html.find(class_='search-hots-fline')
    3. print(hots)

    使用 id 来查找

    1. '''
    2. 查找第一个 id=’J_Search‘ 的标签,再逐层往下找
    3. '''
    4. j_search = html.find(id='J_Search') # 使用id查找
    5. res= j_search.findAll('input') # 使用标签名查找
    6. print(res) # 返回的是包含若干 input 元素的列表
    7. print(res[0])

    指定内容 innerText 来查找

    1. # 通过 innerText 进行查找
    2. content = html.find(string='新款连衣裙')
    3. print(content) # 如果查找到,则返回的是:新款连衣裙
    4. print(content.parent) # 以 新款连衣裙 为innerText 的标签

    指定标签名和属性值来进行查找

    1. # 返回第一个符合的form表单,data-sg-type属性的值为form
    2. form = html.find('form',{'data-sg-type':'form'})
    3. print(form)

    3-2-2)使用css选择器来进行查找
    1. '''
    2. 使用css选择器来查找
    3. '''
    4. # 返回 .search-hots-lines 下 .search-hots-fline 标签的全部内容
    5. flines = html.select('.search-hots-lines .search-hots-fline')
    6. print(flines) # 是列表
    7. print(len(flines))
    8. lis = html.select('.search-hots-lines div a') # div > div > a
    9. print(lis) # 所有符合条件的 a 标签
    10. print(lis[0].string) # 新款连衣裙

    4、socket 通信

    服务端:

    1. import socket
    2. s = socket.socket()
    3. # 绑定任何源都可以连接,开放 5544 端口用于该 socket 通信
    4. s.bind(('0.0.0.0', 6660))
    5. # 开始监听
    6. s.listen()
    7. # 只能接受一个客户端的连接,返回的第一个数据代表通信通道,可以回复信息;第二个数据是用户的信息(对方ip地址和端口号)
    8. chanel, client = s.accept()
    9. while True:
    10. # chanel, client = s.accept() # 如果在这里接收,则客户端只能发送一次消息,然后循环回到accept时,accept会阻塞当前的连接,等待新的连接
    11. print('连接方信息:',client, end=' ;') # 打印用户ip和端口号
    12. receive = chanel.recv(1024).decode() # 解码用户发生过来的信息,最大接收1024字节
    13. print(f'接受到消息:{receive}') # 打印用户发过来的信息
    14. reply = receive.replace('吗','!')
    15. chanel.send(reply.encode()) # 返回信息

    客户端

    1. import socket
    2. s = socket.socket()
    3. s.connect(('192.168.1.11', 6660)) # 目标ip地址,目标端口号
    4. while True:
    5. msg = input() # 在控制台中输入哟啊发送的内容
    6. s.send(msg.encode()) # 发送
    7. receive = s.recv(1024) # 接收返回的信息,10240是接受的最大数据量(字节
    8. print(f'对方回复:{receive.decode()}')

    5、多线程

    1. import random,threading,time
    2. def test(num):
    3. time.sleep(random.choice([0.1, 0.3, 0.6, 1]))
    4. print(f'当前线程为:{threading.currentThread().getName()},{num ** 2}')
    5. if __name__ == '__main__':
    6. print(f'当前执行的线程为:{threading.currentThread().getName()}')
    7. for i in range(9):
    8. # 创建一个线程,该线程需要执行的函数是 test,传递的参数为 i
    9. thread = threading.Thread(target=test, args=(i + 1,))
    10. thread.start() # 开始执行该线程

    多线程改进 socket ,一对多通信:

    服务端:

    1. import threading,socket
    2. s = socket.socket()
    3. s.bind(('0.0.0.0',6660))
    4. s.listen()
    5. def socket_server():
    6. chanel, client = s.accept()
    7. while True:
    8. req = chanel.recv(1024).decode()
    9. if req == '':
    10. print(f'{client} 断开了连接')
    11. break
    12. print(f'接收到连接:{client};收到消息:{req}')
    13. str = req.replace('?','.')
    14. chanel.send(str.encode())
    15. socket_server()
    16. for i in range(2):
    17. thread = threading.Thread(target=socket_server)
    18. thread.start()

    几个客户端复用下面的代码:

    1. import socket
    2. s = socket.socket()
    3. s.connect(('192.168.1.2',6660))
    4. while True:
    5. msg = input()
    6. s.send(msg.encode())
    7. res = s.recv(1024).decode()
    8. print(f'收到对方回复:{res}.')

  • 相关阅读:
    阿里云PolarDB-X荣获“2022 OSCAR 尖峰开源项目及开源社区”奖
    基于B2B平台的医疗病历交互系统
    Grafana+Prometheus打造运维监控系统(一)-安装篇
    Hadoop知识点全面总结
    我的前端实习之旅
    PySide6实现pdf转化为word和长图片
    编译工具:CMake(七) | cmake 常用变量和常用环境变量
    Share| Membership in the American Society of Professionals in P
    C#控制台贪吃蛇
    第六章《类的高级特性》第4节:抽象类
  • 原文地址:https://blog.csdn.net/hao_13/article/details/132608653