Python 爬数据案例 客户端服务端http请求 推荐 【进阶篇 2 】

news2024/11/25 10:43:20

网络爬虫数据原来这么简单!!!

前面已经总结了关于python的面向对象继承多态的知识,这里主要是模块、读写文件、http请求网络数据以及如何获取网络数据知识。

网络爬虫是典型的应用程序,它的工作原理就是通过不断的请求互联网的页面,并从回应中解析获取出有用的数据;数据积累后,可以有很多用处。本文总结了python如何拿到页面数据以及http网络请求的过程。有问题欢迎大家评论区交流探讨,谢谢。

目录

一、python中模块

1.如何自定义模块

2.导入模块

2.1 导入官方模块

2.2 导入自定义模

2.3 安装卸载第三方库

二、python读写文件

1.input( ) 函数 

2.打开文本文件open()函数

3.python读取内容read()

3.1 读取一行readline()

3.2 读取多行readlines()

4.文件写入

4.1写入若干字符

4.2 写入若干行字符

5.文件追加内容

5.1 文件的seek()方法

6.正确关闭文件 

三、客户端服务端 http 网络请求

1.新建server.py文件和client.py文件

1.1server.py文件

1.2 client.py文件 

1.3 终端运行服务端server文件: python server.py

1.4重新打开另一个终端运行客户端client文件: python server.py

1.5 在服务端的终端,将会输出以下信息:

2.python自带的HTTP

3.python发送HTTP请求

4.Python的requests库 

5.HTTP响应的内容 

四、总结


一、python中模块

1.如何自定义模块

虽然python语言本身提供了很多模块,比如:数学模块、文件模块。除了使用官方模块,有时候也需要自定义模块。

如果我们需要创建一个tools模块,用来实现众多的工具函数,那么我们可以创建一个tools.py的文件:

# tools.py
def say_hello():
    print('hello')

def say_goodbye():
    print('goodbye')

2.导入模块

分为官方模块和自定义模块

2.1 导入官方模块

要使用一个模块,我们必须首先导入该模块。Python使用import语句导入一个模块。导入官方模块、导入模块部分函数或属性、导入模块所有内容。不需要考虑路径

# 导入官方模块 math
import math
math.pi      #3.141592653589793

# 导入模块部分函数或属性
from math import pi
print(pi)    #3.141592653589793

# 导入模块里面的所有内容
from math import *

从一个模块导入函数,有可能会遇到导入的函数与本文件的函数冲突的情况。有两种方法可以解决这个问题:第一种是直接导入模块,不指定导入模块里面的具体内容;第二种方法就是使用from ... import as ...语句,as类似重命名

# 把math模块中的pow函数重命名 mathpow
from math import pow as mathpow
2.2 导入自定义模块

导入自定义模块,则需要了解Python导入模块搜索的路径通过sys模块,可以知道导入模块的路径。

2.3 安装卸载第三方库

尽管python提供了非常强大的官方模块,但在实际开发中,经常会用到第三方模块。在安装Python的时候,Python环境提供了安装第三方模块的工具:pip,通过这个工具,可以非常快捷的安装第三方模块。

# 安装Django模块:
pip install django

# 卸载Django模块
pip uninstall django

二、python读写文件

1.input( ) 函数 

input()函数可以接收外部的输入。比如我们现在计算从1到n的乘法运算,只需要输入num,输入10计算结果就是1到10相乘的结果,还可以输入20,25等。

注意:输入的是字符串,需要转型为数字类型。

2.打开文本文件open()函数

可以打开一个文件,得到一个文件file对象,而file对象提供相关的方法对文件内容进行读写等操作。

open()函数有若干个参数,比较重要的是以下三个参数:

  1. 文件路径:指定需要打开的文件的文件路径
  2. 打开模式:针对不同文件(二进制文件、文本文件)以及不同操作(读操作、写操作),会有不同的打开模式
  3. 编码:设定打开文件的默认编码

我们在index.py同级新建test.txt文件,然后在index.js文件中打开。为了安全操作文件,文件使用完毕后,需要使用close()函数正确关闭

常用的打开模式如下:

打开文本文件是并不需要特别指定模式t,因为默认就是以文本方式打开文件

3.python读取内容read()

文件对象提供read()方法,可以读取文件中的若干个字符,它提供一个参数size,可以指定读取字符的数量。

在test.txt文件中新增hello world内容。然后读取前4个字符:

如果连续两次进行读取

可以发现第二次读取的数据是继第5个字符开始读取的。 

3.1 读取一行readline()

文件对象提供readline()方法,和read()方法类似,可以读取文件中的若干个字符,它也提供一个参数size,可以指定读取字符的数量,不过和read()方法不同的是,readline()方法遇到一行结束的时候,就会返回。

3.2 读取多行readlines()

4.文件写入

要把字符串内容写入文件,需要使用w的模式打开文件。参数

  •  w 模式表示打开一个文件进行写入,如果文件内容已存在,会清除原有的内容 
  •  wb 模式表示以二进制格式只写模式打开一个文件,会清除原有的内容
  •  w+ 模式表示打开一个文件进行读写,如果文件内容已存在,会清除原有的内容
4.1写入若干字符

4.2 写入若干行字符

5.文件追加内容

Python提供文件追加内容的打开模式,可以往文件尾部添加内容,又不清空文件原有的内容。

  •  a 模式表示打开一个文件并追加内容,会往文件尾部添加内容 
  •  ab 模式表示以二进制格式打开一个文件并追加内容,会往文件尾部添加内容
  •  a+ 模式表示打开一个文件并使用追加进行读写

5.1 文件的seek()方法

文件对象还提供seek()方法,可以移动文件的游标位置,它接受一个参数,表示文件的位置,0:文件首部,1:当前位置,2:文件尾部,通过seek()可以把文件游标移动到文件首部但不删除文件的内容。 

如图可以看到当第一次读取文件时没有内容,当把光标移动到首位时可以读取到文件内容。

6.正确关闭文件 

前面我们已经使用close关闭文件,但是如果在使用close()关闭文件之前程序异常退出了,那么也得不到正确的关闭。Python提供with关键字,可以免除这类后顾之忧。

with open('test.txt', 'r') as f:
    content = f.readlines()
    for line in content:
        print(line)

当文件使用结束后,不需要显式的调用f.close()关闭文件。

三、客户端服务端 http 网络请求

要进行网络通信,需要建立起通信双方的连接,连接的双方分别称为客户端和服务端,在Python中,使用套接字socket来建立起网络连接。

套接字包含在socket模块中:

import socket
socket.socket()

对于客户端和服务端,都是使用socket来建立连接的,但是在使用行为上,客户端和服务端会有一些不一样。
服务端建立需要四个步骤:新建socket、绑定IP和端口(bind)、监听连接(listen)、接受连接(accept)。
客户端建立则简单一些,仅需两个步骤:新建socket、连接服务端(connect)。
当网络连接上以后,客户端和服务端就可以进行数据通信了,套接字通过send()函数发送数据,通过recv()函数接收数据。

1.新建server.py文件和client.py文件

1.1server.py文件
import socket

server = socket.socket() # 1. 新建socket
server.bind(('127.0.0.1', 8999)) # 2. 绑定IP和端口(其中127.0.0.1为本机回环IP)
server.listen(5) # 3. 监听连接
s, addr = server.accept() # 4. 接受连接
print('connect addr:{}'.format(addr))
content =s.recv(1024)
print(str(content, encoding='utf-8'))  # 接受来自客户端的消息,并编码打印出来
s.close()
1.2 client.py文件 
import socket

client = socket.socket() # 1. 新建socket
client.connect(('127.0.0.1', 8999)) # 2. 连接服务端(注意,IP和端口要和服务端一致)
client.send(bytes('Hello World. Hello Socket', encoding='utf-8')) # 发送内容,注意发送的是字节字符串。
client.close()
1.3 终端运行服务端server文件: python server.py
1.4重新打开另一个终端运行客户端client文件: python server.py
1.5 在服务端的终端,将会输出以下信息:
connect addr:('127.0.0.1', 50970)
b'Hello World. Hello Socket'

2.python自带的HTTP

Python提供了简易的HTTP服务器,可以直接运行起来。
在终端,输入这条命令:python -m http.server,就可以启动一个HTTP服务器。

python -m http.server

# 启动成功会输出
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

现在我们就可以访问8000端口了看到由这个服务器提供的网页。

这个HTTP服务器会把运行目录的所有文件列出来,并提供下载功能。 在浏览的过程中,实际上是浏览器向HTTP服务器发送了一个HTTP请求。

3.python发送HTTP请求

除了使用浏览器发送HTTP请求,通过代码也可以向HTTP服务器发送请求,Python提供了相关的库urllib,通过urllib包里面的request,可以向其他HTTP服务器发起请求。

from urllib import request
response = request.urlopen('https://www.baidu.com') # 向慕百度官网发出请求
print(response) # ==> <http.client.HTTPResponse object at 0x0000012F9A597880>

请求成功的话,会得到一个HTTPResponse,它是来自HTTP服务器的一个回应,把这个回应的一些信息打印出来看一下。是200

下面的代码打印HTTPResponse附带的一些信息,包括服务端的服务器是什么、请求时间、内容类型、内容长度等等。

4.Python的requests库 

Python官方提供的urllib库可以满足一般情况下的HTTP操作,但是urllib这个库设计是用来处理url地址的,并不是专门处理HTTP操作的包。因此,在很多场景下,一般会使用requests库来进行HTTP请求。
requests库是著名的Python第三方库,使用requests库,可以定制化你的HTTP请求,包括请求方法,请求参数等等。

4.1 安装resquests

pip install requests

4.2 使用requests库来请求

在一般的使用上,requests和urllib没有太大区别,但是在复杂的场景中,requests可以提供urllib无法提供的强大功能。因此,在使用上,建议使用requests库代替urllib库来进行HTTP请求等的操作。

5.HTTP响应的内容 

前面我们打印了响应状态以及请求头信息,同样也可以打印出响应内容 response.content,

但是我们看到打印内容是一个很长的字符串非常的乱。 但其实它是由结构的,它是一个标准的HTML页面,可以从页面内容里面获取很多有用的数据。
网络爬虫是典型的应用程序,它的工作原理就是通过不断的请求互联网的页面,并从回应中解析获取出有用的数据;数据积累后,可以有很多用处。

拿到内容后 我们可以对数据进行简单的处理。

con_list = content.split('\n') # 分行
len(content_list) # 打印页面内容的行数

在网页中,页面内部链接其他资源的信息是通过href提供的,通过字符串匹配的方式可以过滤出包含链接的行。

for line in con_list:
    if 'href' in line:
        print(line.strip())

过滤出来的信息或许有些杂乱,但也包含了一些有用的数据,我们可以从过滤后的信息中找到链接相关的信息。不过我们过滤的方式比较简单,通过优化过滤的方式可以匹配到更加精准的数据。而爬虫正是这样工作的。

四、总结

现在我们已经可以从网站上获取我们需要的数据了。

我们现在总结一下本文的主要内容:

  1. 模块定义模块导入(官方模块、自定义模块、第三方库)第三方库如何安装卸载
  2. 文件文件的读取写入文件数据如何正确关闭文件
  3. 请求:介绍了客户端和服务端通信的几种方式、以及第三方requests库、如何拿到响应(状态、responseHeader信息、响应内容)。

更多python的基础知识 请参考:

Python 面向对象 继承 多态 slots等特殊方法 【进阶篇 1 】-CSDN博客

【 Python入门篇 1、 2、 3 】

Python 3 入门基础知识【1】数据类型 安装下载 推荐-CSDN博客

Python 3 入门基础知识 之数据容器及用法【2】 推荐-CSDN博客

Python 3 入门基础知识【3】递归函数以及参数部分-CSDN博客


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

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

相关文章

VBA语言専攻T3学员领取资料通知0817

T3学员领取资料通知0817 各位学员∶本周MF系列VBA技术资料增加681-690讲&#xff0c;T3学员看到通知后请免费领取,领取时间8月16日晚上19:00-8月17日中午12:00。本次增加内容&#xff1a; MF691:按所选范围对行进行分组显示 MF692:查找所给范围内的重复项 MF693:文本框Text…

python非交互连接mysql+mycat读写分离实现

python非交互连接mysql >>>import pymysql >>>connpymysql.connect(host"192.168.118.57",port3306,database"test",user"root",password"root") >>> cursorconn.cursor() >>> cursor.execut…

基于springboot的智能家居系统

TOC springboot198基于springboot的智能家居系统 研究背景与现状 时代的进步使人们的生活实现了部分自动化&#xff0c;由最初的全手动办公已转向手动自动相结合的方式。比如各种办公系统、智能电子电器的出现&#xff0c;都为人们生活的享受提供帮助。采用新型的自动化方式…

day22 Java基础——方法(干货)

day22 Java基础——方法 在Java中&#xff0c;方法是一段组织好的、可重复使用的代码块&#xff0c;用于执行一个特定的操作。方法提供了一种封装代码的方式&#xff0c;使得代码模块化&#xff0c;便于管理和重用。以下是关于Java中方法的一些基本介绍&#xff1a; 文章目录…

对话图像编辑研究综述

MGIE&#xff1a;MLLM 引导图像编辑&#xff08;ICLR 2024&#xff09; https://mllm-ie.github.io/ 利用 MLLM 来增强基于指令的图像编辑 (“what will this image be like if [instruction]” &#xff0c;来重写)。 训练好后&#xff0c;大视觉语言模型直接推导出简洁明确…

FreeRTOS队列(下)

文章目录 一、使用队列实现多设备输入1、增加旋转编码器2、使用队列集执行任务3、增加姿态控制&#xff08;使用MPU6050控制挡球板&#xff09; 二、队列实验_分发数据给多个任务(赛车游戏)三、传输大块数据四、示例&#xff1a;邮箱&#xff08;Mailbox&#xff09;五、队列集…

远程桌面你的凭据不工作解决方法

如果遇到“你的凭据不工作”的提示&#xff0c;请首先确认您输入的凭据是否正确。如果确认无误但仍然出现Windows远程桌面凭据不工作的提示&#xff0c;这可能是由于Windows安全设置的问题所导致的。要解决远程桌面连接提示你的凭据不工作这一问题&#xff0c;您可以尝试以下解…

qemu的VNC协议(RFB协议)

1、握手 1.1、服务器收到客户端TCP连接上后&#xff0c;服务器发送RFB的版本&#xff1a; 52 46 42 20 30 30 33 2e 30 30 38 0a RFB 003.008\n 1.2、客户端收到后回复&#xff1a; 52 46 42 20 30 30 33 2e 30 30 38 0a RFB 003.008\n 2、安全认证 2.1、服务器发送支…

MySQL数据库之part2

一、索引原理与慢查询优化 一&#xff09;介绍 1、为何需要有索引 一般的应用系统&#xff0c;读写比例是10:1左右&#xff0c;而且插入操作和一般的更新操作很少出现性能问题。在生产环境中&#xff0c;我们遇到最多的、也是最容易出问题的还是一些负责的查询操作。因此查询语…

密码学基础---椭圆曲线一文打尽

1.ECC简介及密钥生成 当前公认安全有效的三大类公钥密钥体制分别为基于大数因子分解难题(RSA)、离散对数难题(DSA)和椭圆曲线离散对数&#xff08;ECC&#xff09;难题的密码体制。 最初RSA由于其容易理解被广泛运用&#xff0c;但随着计算机性能的提升&#xff0c;要保证RS…

JavaScript学习笔记(十三):网络请求JS AJAX

1、AJAX - XMLHttpRequest 对象 1.1 XMLHttpRequest 对象是 AJAX 的基石。 创建 XMLHttpRequest 对象定义回调函数打开 XMLHttpRequest 对象向服务器发送请求 1.2 XMLHttpRequest 对象 所有现代浏览器都支持 XMLHttpRequest 对象。 XMLHttpRequest 对象可用于在后台与 Web…

【mysql】MySQL的数据库简单搭建

文章目录 前言基础知识数据库数据表数据表结构记录&#xff08;数据&#xff09; 数据类型数值类型字符串类型日期类型二进制类型其他数据类型 约束where子句其他条件 order by 语句 &#xff08;排序&#xff09;group by语句&#xff08;分组&#xff09; 数据库操作新建数据…

漏洞挖掘 | EDU拿敏感信息的骚思路

1. 寻找资产 在进行edu漏洞挖掘的时候&#xff0c;我们常常遇到统一认证平台&#xff0c;账号是学号&#xff0c;密码是身份证后6位&#xff08;甚至是更复杂的密码&#xff09;&#xff0c;同时找到这两者的几率很小&#xff0c;所以我们把关注点放在微信小程序中&#xff0c…

15 个高难度 Java 面试题及答案

一、企业聘用指南 聘用合适的 Java 开发人员对您的业务至关重要。聘用不当可能会导致代码效率低下、错过最后期限以及团队活力不佳。这就是为什么在聘用候选人之前必须彻底审查每位候选人的原因。这个过程的一部分是在面试 Java 开发人员候选人时提出正确的问题。 通过我们列…

OK-COIN : 总统大选成为比特币牛市的导火索

每一届总统大选&#xff0c;都将带动比特币进入牛市行情&#xff0c;还有三个多月时间&#xff0c;现在比特币经过底部针震荡整理后&#xff0c;形成了坚实的“双针探底”形态&#xff0c;确认比特币底部形成&#xff0c;随后迎来了非常强势的单边趋势性行情机会 &#xff0c;相…

IDEA关键词全局检索-之jar包

正常没有下载到源码的jar包&#xff0c;是无法检索到.class编译文件中内容的 repository本地仓库中&#xff0c;也是没有源码的 《检索步骤》 1、首先&#xff0c;下载源码 - 可以配置maven自动下载所有jar包的源码&#xff08;再同样配置File-NewProjectsSetup-Settingsfor…

CAN总线学习笔记

1 CAN总线简介 CAN&#xff08;Controller Area Network&#xff09;控制器局域网。 2 电平表示 CAN 总线用两根数据线传输数据&#xff0c;使用差分信号。 2.1 显性电平–低电平–逻辑零 当单片机发送逻辑0信号时&#xff0c;CAN转换芯片输出端会输出一个3.5V信号和一个…

【大模型理论篇】GPT系列预训练模型原理讲解

1. 背景简述 GPT的全称是Generative Pre-Trained Transformer&#xff0c;以Transformer为基础模型&#xff08;可以看Transformer的原理解析&#xff09;&#xff0c;先后迭代了GPT-1【1】&#xff0c;GPT-2【2】&#xff0c;GPT-3【3】、GPT3.5(InstructGPT)【10】、GPT4。…

【直播预告】智能机器人赛道技术培训定档8.20

在不远的将来&#xff0c;机器人可能会成为我们日常生活中不可或缺的伙伴&#xff0c;它们在工业生产线上精准操作&#xff0c;在家庭中提供温馨陪伴&#xff0c;甚至在探索未知领域中担当先锋。而现在&#xff0c;正是我们拥抱这一未来&#xff0c;深入了解并掌握智能机器人技…

【一个月备战国赛】按模型算法分类的国内外优秀论文分享

时间一天一天过去&#xff0c;离国赛又更近一步&#xff0c;昨天分享了matlab的算法程序包&#xff0c;但是可能很多小伙伴拿到算法之后&#xff0c;不知道该如何去使用&#xff0c;如何与题目相结合去完成论文的写作&#xff0c;那么这里就需要家人们提高自己文章的阅读量&…