读者可以不用看这段
(用python来编写脚本简化日常的运维工作是python的一个重要用途,在linux中,可以用ps,top,free这样的命令查看,在python中,获取系统信息的一个好办法就是psutil这个第三方模块,它是python的系统监控及进程的管理工具,是一个系统很强大的跨平台的系统管理库,目前psutil支持的系统有linux,window os X等)
一、requests请求库
1、介绍
requests是一个优雅而简单的python HTTP请求库,requests的作用是发送请求获取响应数据
2、安装
在终端(命令行工具)运行如下命令即可
pip install requests
pip list可以查看安装了的库
注意:
1、如果你要安装python虚拟环境中,先进入虚拟环境再执行上述命令
2、如果系统中既安装了python2,又安装了python3,需要安装python3环境中:pip3 install requests
3、requests基本使用
1、请求方法
1、导入模块
2、发送get请求,获取响应
3、从响应中获取数据
1、导入模块
import requests
2、发送请求,获取响应
response=requests.get("http://www.baidu.com")
3、从响应中获取数据
print(response.text)
response常见属性:
response.test:响应的字符串数据
response.encoding:打印使用的字符编码
response.content:打印响应的二进制数据
设置编码为utf-8:response.encoding="utf-8"
4、requests发送带header的请求和带参数的请求
1、header
2、params
你也许经常想为 URL 的查询字符串(query string)传递某种数据。如果你是手工构建 URL,那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。例如, httpbin.org/get?key=val。 Requests 允许你使用 params 关键字参数,以一个字符串字典来提供这些参数。
效果如下图所示
代码练习:
结果为:
在网上解码以后就是https://www.baidu.com/传智播客
5、爬虫实战
import requests
class TIebaSpider:
def __init__(self,tieba_name):
self.tieba_name=tieba_name
self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"}
self.url_temp="https://tieba.baidu.com/f?kw="+tieba_name+"&ie=utf-8&pn={}"
#构造url列表
def get_url_list(self):
url_list=[]
for i in range(3):
url_list.append(self.url_temp.format(i*50))
return url_list
#发送请求,获取响应
def parse_url(self,url):
print(url)
response=requests.get(url,headers=self.headers)
return response.content.decode()
def save_html(self,html_str,page_num):
file_path="{}-第{}页".format(self.tieba_name,page_num)
with open(file_path,"w",encoding="utf-8") as f:
f.write(html_str)
def run(self):
#1、构造url列表
url_list=self.get_url_list()
#2、遍历,发送请求,获取响应
for url in url_list:
html_str=self.parse_url(url)
#3、保存
page_num=url_list.index(url)+1
self.save_html(html_str,page_num)
if __name__=="__main__":
tieba_spider=TIebaSpider("李毅")
tieba_spider.run()
6、requests深入
6.1、发送post请求
用法:
response=requests.post("http://www.baidu.com/",data=data,headers=headers)
data的形式:字典
请求百度翻译的应用
结果为:
想要实现任意输入,代码如下:
得在上述的代码里加上以下代码
效果为:
6.2 使用代理
代码实现:
6、3 requests模拟登录的三种方式
二、BeautifulSoup库
1、BeautifulSoup库的作用
是一个可以从html或xml文件中提取数据的python库
2、安装BeautifulSoup库
1、先安装beautiful Soup4
pip install bs4
2、安装lxml解析库
pip install lxml
3、BeautifulSoup对象介绍与创建
BeautifulSoup对象
beautifulSoup对象:代表要解析整个文档树,它支持遍历文档和搜索文档树中描述的大部分的方法
创建BeautifulSoup对象
1、导入模块
from bs4 import BeautifulSoup
2、创建BeautifulSoup对象
soup=BeautifulSoup("<html>data</html>","lxml")
print(soup)
结果为:
4、BeautifulSoup对象的find方法
find的作用
搜索文档树
find的用法
find(self,name=None,attrs={},recursive=True,text=None,**kwargs)
参数:
name:标签名
attrs:属性字典
recursive:是否递归循环查找
text:根据文本内容查找
返回:查找到的第一个元素对象
若想要返回所有元素对象,则使用find_all
案例1:根据标签名查找
获取下面文档中的title标签和a标签
解题步骤:
1、导入模块
2、准备文档字符串
3、创建BeautifulSoup对象
4、查找文档中的title标签
5、查找文档中的a标签
#1、导入模块
from bs4 import BeautifulSoup
#2准备文档字符串
html='''写入上面图片的代码'''
#3、创建BeautifulSoup对象
soup = BeautifulSoup(html,"lxml")
#4、查找title标签
title=soup.find("title")
print(title)
#5、查找a标签
a=soup.find("a")
print(a)
#6、查找所有的a标签
a_s=soup.find_all("a")
print(a_s)
结果为:
案例2:根据属性进行查找
查找id为link1的标签
...
#方式1:通过命名参数进行指定
# id=soup.find(id="link1")
# print(id)
#方式2:使用attrs来指定属性字典进行查找
a=soup.find(attrs={"id":"link1"})
print(a)
案例3:根据文本查找
获取下面文档为elise的标签文本
#6、查找文本为elise的标签文本
text=soup.find(text="elise")
print(text)
5、Tag对象
tag可以获取标签内容
...
a=soup.find(attrs={"id":"link1"})
print(a)
#7、tag对象
print(type(a))
print("标签名:",a.name)
print("标签所有属性:",a.attrs)
print("标签文本内容:",a.text)
结果为:
小结:
三、应用-从疫情首页获取数据
#1、导入相关模块
import requests
from bs4 import BeautifulSoup
#2、发送请求,获取疫情首页内容
response=requests.get("http://ncov.dxy.cn/ncovh5/view/pneumonia")
#3、从响应中获取数据
home_page=response.content.decode()
# print(home_page)
#4、使用BeautifulSoup,提取疫情数据,构建BeautifulSoup对象
soup=BeautifulSoup(home_page,"html.parser")
#根据id属性查找,包含全国疫情信息的标签
script=soup.find(id="getAreaStat")
#获取标签中文本内容
text=script.text
print(text)
四、正则表达式
概念
正则表达式是一种字符串匹配模式
作用
其中python爬虫中用的最多的就是:提取某个字符串中匹配的子串
正则表达式常见语法
. | 匹配任意一个字符 |
---|---|
\ | 转义字符,使后一个改变原来的意思 |
[…] | 表示取[]范围中的某一个 |
\d | 匹配数字:[0-9] |
\D | 匹配非数字 |
\s | 空白字符 |
\S | 非空白字符 |
\w | 单词字符[A-Za-z0-9_] |
\W | 非单词字符 |
* | 匹配前一个字符0或无限次 |
+ | 匹配前一个字符1次以上 |
? | 匹配前一个字符0次或1次 |
{m} | 匹配前一个字符m次 |
1、re.findall()方法
语法:
re.findall(pattern,string,flags=0)
参数:
pattern:正则表达式
string:从这个字符串中查找
flags:匹配模式
作用:
扫描整个string字符串,返回所有与pattern匹配的列表
返回值:
返回string中与pattern匹配的结果列表
分组的使用
#2、findall方法中分组的使用
import re
#2、findall方法中分组的使用
rs=re.findall("a.+bc","a\nbc",re.DOTALL)
print(rs)
rp=re.findall("a(.+)bc","a\nbc",re.DOTALL)
print(rp)
结果为:
['a\nbc']
['\n']
总结:
如果正则表达式中没有(),则返回与整个正则匹配的列表;
如果正则表达式中有(),则返回()中匹配的内容列表,小括号两边东西都是负责确定提取数据所在位置
2、r原串的使用
主要用来解决转义符的问题
#1、在不使用r原串的时候,遇到转义符怎么做
rs=re.findall("a\nbc","a\nbc")
print(rs)
#2、r原串在正则中就可以消除转义符带来的影响
rs=re.findall(r"a\nbc","a\nbc")
print(rs)
结果为:
['a\nbc']
['a\nbc']
结论:
正则中使用r原始字符串,能够忽略转义符号带来的影响
待匹配的字符串中有多少个,r原串正则中就添加多少个\即可
五、json模块
1、json简介
json模块是python自带的模块,用于json与oython数据之间的相互转换
2、json与python数据类型的对应关系
json | python |
---|---|
object | dict |
array | list |
string | str |
number(int) | int,long |
number(real) | float |
true | True |
false | False |
null | None |
3、json转换为python
图解如下:
import json
#1、将json字符串转换为python数据
#1.1 准备json字符串
json_str='''[{"provinceName":"美国","currentConfirmedCount":1179041,"confirmedCount":68851},
{"provinceName":"英国","currentConfirmedCount":222227,"confirmedCount":259559}]'''
#转换为python数据
rs=json.loads(json_str)
print(rs)
#打印rs的类型
print(type(rs))
#打印rs里第一个元素的类型
print(type(rs[0]))
#2、把json格式文件,转换为python类型的数据
#2、1构建指向该文件的文件对象
with open("test.json") as fp:
#2、2加载该文件对象,转换为python类型的数据
python_list=json.load(fp)
print(python_list)
print(type(python_list))
print(type(python_list[0]))
结果为:
[{'provinceName': '美国', 'currentConfirmedCount': 1179041, 'confirmedCount': 68851}, {'provinceName': '英国', 'currentConfirmedCount': 222227, 'confirmedCount': 259559}]
<class 'list'>
<class 'dict'>
4、python转换为json
import json
#1、把python转换为json字符串
#1.1 准备Python数据
json_str='''[{"provinceName":"美国","currentConfirmedCount":1179041,"confirmedCount":68851},
{"provinceName":"英国","currentConfirmedCount":222227,"confirmedCount":259559}]'''
rs=json.loads(json_str)
#1.2 把python转换为json字符串
json_str=json.dumps(rs,ensure_ascii=False)
print(json_str)
#2、把python以json格式存储到文件
#2、1构建要写入的文件对象
with open("test1.json","w") as fp:
json.dump(rs,fp,ensure_ascii=False)