网络爬虫数据原来这么简单!!!
前面已经总结了关于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()函数有若干个参数,比较重要的是以下三个参数:
- 文件路径:指定需要打开的文件的文件路径
- 打开模式:针对不同文件(二进制文件、文本文件)以及不同操作(读操作、写操作),会有不同的打开模式
- 编码:设定打开文件的默认编码
我们在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())
过滤出来的信息或许有些杂乱,但也包含了一些有用的数据,我们可以从过滤后的信息中找到链接相关的信息。不过我们过滤的方式比较简单,通过优化过滤的方式可以匹配到更加精准的数据。而爬虫正是这样工作的。
四、总结
现在我们已经可以从网站上获取我们需要的数据了。
我们现在总结一下本文的主要内容:
- 模块:定义模块、导入(官方模块、自定义模块、第三方库)、第三方库如何安装卸载
- 文件:文件的读取、写入文件数据、如何正确关闭文件
- 请求:介绍了客户端和服务端通信的几种方式、以及第三方requests库、如何拿到响应(状态、responseHeader信息、响应内容)。
更多python的基础知识 请参考:
Python 面向对象 继承 多态 slots等特殊方法 【进阶篇 1 】-CSDN博客
【 Python入门篇 1、 2、 3 】
Python 3 入门基础知识【1】数据类型 安装下载 推荐-CSDN博客
Python 3 入门基础知识 之数据容器及用法【2】 推荐-CSDN博客
Python 3 入门基础知识【3】递归函数以及参数部分-CSDN博客