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

网络爬虫数据原来这么简单!!! 收藏备用

前面已经总结了关于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的基础知识 请参考:

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

2.python中内置高阶函数:Python 函数式编程 内置高阶函数及周边【进阶篇 3】推荐-CSDN博客

【 Python入门篇 1、 2、 3 】

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

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

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


  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值