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请求

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

1-2)发送 post 请求

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

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

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

1-4)使用 post 上传文件

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

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

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

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

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

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

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

3、基于 beautifulSoup 的爬虫

> pip install bs4

> pip install lxml                                安装解析器lxml

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

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

3-1)初始化解析器

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

3-2)查找页面元素

print(html.head.title)          # <title>淘宝</title>
print(html.head.title.string)   # 淘宝
print(html.div)         # 获取到的是文档中的第一个div元素及其所有子元素
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

使用标签名来查找

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

使用类名 class 来查找

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

使用 id 来查找

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

指定内容 innerText 来查找

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

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

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

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

4、socket 通信

服务端:

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

客户端

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

5、多线程

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

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

服务端:

import threading,sockets = socket.socket()
s.bind(('0.0.0.0',6660))
s.listen()def socket_server():chanel, client = s.accept()while True:req = chanel.recv(1024).decode()if req == '':print(f'{client} 断开了连接')breakprint(f'接收到连接:{client};收到消息:{req}')str = req.replace('?','.')chanel.send(str.encode())socket_server()for i in range(2):thread = threading.Thread(target=socket_server)thread.start()

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

import sockets = socket.socket()s.connect(('192.168.1.2',6660))while True:msg = input()s.send(msg.encode())res = s.recv(1024).decode()print(f'收到对方回复:{res}.')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/68178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务部署】五、Jenkins+Docker一键打包部署NodeJS(Vue)项目的Docker镜像步骤详解

NodeJS&#xff08;Vue&#xff09;项目也可以通过打包成Docker镜像的方式进行部署&#xff0c;原理是先将项目打包成静态页面&#xff0c;然后再将静态页面直接copy到Nginx镜像中运行。 一、服务器环境配置 前面说明了服务器Nginx的安装和配置&#xff0c;这里稍微有些不同&a…

mysql Index

创建索引 方法1 create table 表( col1 int, col2 int, … index | key index_name (列名) 方法2 alter table 表名 ADD index alter table student_table add index index_name(stu_id); 方法3 create index index_name on 表名(列) 删除索引 方式1 alter table xx drop prima…

革命性的电子元件:RAD继电器 | 百能云芯

在现代电子和通信系统中&#xff0c;RAD继电器是一种关键的电子元件&#xff0c;它在各种应用中发挥着重要作用。RAD继电器&#xff08;Reed-relay Actuated Device&#xff09;是一种基于磁性原理的电子开关&#xff0c;其特点是极其高速、可靠、低功耗和长寿命。下面云芯将为…

案例分享:西河水库安全监测信息化系统实施方案

一、项目概述1.1项目背景西河水库信息化工作已开展多年&#xff0c;但是由于西河水库监测设备都已经老化或者损坏&#xff0c;现有设备已渐渐不能满足新时期西河水库信息化和现代化发展需求。因此&#xff0c;灌区管理局拟在运用现代信息和通信技术手段感测、分析、整合水库运行…

el-date-picker自定义只能选中当前月份和半年内月份等

需求&#xff1a;el-date-picker只能选中当前月期和当前月期往前半年&#xff0c;其他时间就禁用了不让选择了&#xff0c;因为没数据哈哈。当然也可以选择往前一年等。 一、效果 二、写个日期选择器 :picker-options&#xff1a;日期选项 value-format&#xff1a;选择后的格…

设计模式-工厂模式Factory

工厂模式 b.工厂方法模式 (Factory Method) (重点)1) 简单工厂 Simple Factory1.a) 简单工厂的好处 2) 工厂方法 Factory Method2.a) 对工厂进行抽象化 (版本一)2.b) 对工厂进行缓存 (版本二)2.c) 加载配置文件到缓存中 (版本三)c.1) 产品线 c.抽象工厂模式 (Abstract Factory)…

SQL-DQL

-----分组查询----- 1.语法&#xff1a; SELECT 字段列表 FROM 表名 [WHERE 条件 ] GROUP BY 分组字段名 [HAVING 分组后过滤条件]&#xff1b; 2.where与having区别 》执行时机不同&#xff1a;where是分组之前进行过滤&#xff0c;不满足where条件&#xff0c;不参与分组&…

【Flutter】Flutter 使用 qr_flutter 实现QR码二维码生成与渲染

【Flutter】Flutter 使用 qr_flutter 实现QR码二维码生成与渲染 文章目录 一、前言二、qr_flutter 包简介三、安装与配置四、基本使用五、高级功能与自定义六、完整实际业务代码示例七、总结 一、前言 亲爱的 Flutter 初学者&#xff0c;你好&#xff01;今天我要与你分享一个…

【黑马头条之项目部署_持续集成Jenkins】

本笔记内容为黑马头条项目的项目部署_持续集成部分 目录 一、内容介绍 1、什么是持续集成 2、持续集成的好处 3、今日内容 二、软件开发模式 1、软件开发生命周期 2、软件开发瀑布模型 3、软件的敏捷开发 三、Jenkins安装配置 1、Jenkins介绍 2、Jenkins环境搭建 …

OJ题库:计算日期到天数转换、打印从1到最大的n位数 、尼科彻斯定理

前言&#xff1a;在部分大厂笔试时经常会使用OJ题目&#xff0c;这里对《华为机试》和《剑指offer》中的部分题目进行思路分析和讲解&#xff0c;希望对各位读者有所帮助。 题目来自牛客网&#xff0c;欢迎各位积极挑战&#xff1a; HJ73:计算日期到天数转换_牛客网 JZ17:打印…

【【STM32-29正点原子版本串口发送传输实验】

STM32-29正点原子版本串口发送传输实验 通过串口接收或发送一个字符 例程目的 开发板上我们接入的是实现异步通信的UART接口 USB转串口原理图 我们一步步分析 PA9是串口1 的发送引脚 PA10是串口1 的接受引脚 。因为我们现在只是用到异步收发器功能&#xff0c;所以我们现…

qt中子窗口最小化后再恢复显示窗口区域显示为全白色

问题&#xff1a; qt中子窗口最小化后再恢复显示窗口区域显示为全白色&#xff0c;如下图&#xff1a; 原因&#xff1a; 恢复显示后窗口为及时刷新。 解决办法&#xff1a; 重写showEvent函数&#xff0c;如下&#xff1a; void MyClass::showEvent(QShowEvent *event) {se…

大模型 Dalle2 学习三部曲(二)clip学习

clip论文比较长48页&#xff0c;但是clip模型本身又比较简单&#xff0c;效果又奇好&#xff0c;正所谓大道至简&#xff0c;我们来学习一下clip论文中的一些技巧&#xff0c;可以让我们快速加深对clip模型的理解&#xff0c;以及大模型对推荐带来革命性的变化。 clip结构 首选…

Mybatis 动态SQL – 使用choose标签动态生成条件语句

之前我们介绍了if,where标签的使用&#xff1b;本篇我们需要在if,where标签的基础上介绍如何使用Mybatis提供的choose标签动态生成条件语句。 如果您对if,where标签动态生成条件语句不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybat…

CSS中如何实现文字描边效果(Text Stroke)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 文字描边效果&#xff08;Text Stroke&#xff09;⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个…

Go实现LogCollect:海量日志收集系统【上篇——LogAgent实现】

Go实现LogCollect&#xff1a;海量日志收集系统【上篇——LogAgent实现】 下篇&#xff1a;Go实现LogCollect&#xff1a;海量日志收集系统【下篇——开发LogTransfer】 项目架构图&#xff1a; 0 项目背景与方案选择 背景 当公司发展的越来越大&#xff0c;业务越来越复杂…

Mysql底层数据结构为什么选择B+树

索引底层采用什么数据结构&#xff0c;为什么使用B树而不是其他数据结构&#xff1a; &#xff08;1&#xff09;如果采用二叉树&#xff1a;使用递增字段作为索引时&#xff0c;二叉树会退化成链表&#xff0c;查找效率太低 &#xff08;2&#xff09;如果采用红黑树&#xf…

微信小程序开发:一种新型的移动应用程序开发方式

一、引言 随着移动互联网的快速发展&#xff0c;微信小程序作为一种新型的移动应用开发方式&#xff0c;正在受到越来越多的关注。微信小程序是一种基于微信平台的轻量化应用&#xff0c;开发者可以通过微信提供的开发工具和接口&#xff0c;开发出各种具有特定功能的应用程序…

如何创建一个自己的sphinx文档网站

文章目录 前言一、操作步骤1.安装anaconda2.启动python3.8环境3.安装Sphinx4.创建文件夹5.初始化环境6. 编译7.文件夹搭查看8.搭建nginx查看8. 更换主题9.错误修复10.这里提供两个模板1.Demo_md2.Demo_rst前言 最近看到公司的文档中心,突然想起,为什么不为自己创建一个文档中…

在k8s中用label控制Pod部署到指定的node上

案例-标注k8s-node1是配置了SSD的节点 kubectl label node k8s-node1 disktypessd 查看标记 测试 将pod部署到disktypessd的节点上&#xff08;这里设置了k8s-node1为ssd&#xff09; 部署后查看结果-副本全都运行在了k8s-node1上—符合预期 删除标记 kubectl label node k8…