好久没写python的主题的了,今天写些数据抓取的......
行业礼貌
emmm~(虽然不一定实际大家都遵守,不然就不会有一些互博的技术出来了):
第一、尊重版权
第二、不要过度访问网站,以免干扰正常业务(每次访问之后等待一定的时间,这个其实在互博上也是有用的)
第三、不要爬取"禁止爬取"的
网站,如果某个网站不希望被爬取,一般会在robots.txt文件或者HTML文件中名为robots的meta标签中声明。
要用到的库
【requests】接口请求
pip requests (接口请求的库,接口自动化也有用到,之前也有提到哦,不过这边再提一次用法吧)
python
import rqueests
url="访问的地址"
response = request.get(url) # 获取网页数据
response.encoding = response.apparent_encoding # 防止出现乱码
print(response。text) # 显示或取的字符串数据
requests.get可以获取各类信息例如:
response.text 字符串数据
response.content 二进制数据
response.url 访问的网址
response.apparent_encoding # 推测的文字编码
response.status_code # HTTP状态码(200表示正常,404表示未找到,等)
reponser.headers # 响应头
温故下读写文件(感觉面试爱问,之前吉利那边的面试也遇到过)
直接写的方式:
f = open(文件路径/文件名.文件后缀,mode="w",encoding="utf-8")# 用写模式打开文件
f.write(要写入的内容) # 写入数据
f.close() # 关闭文件
使用with open,他的好处是不需要自己写close关闭
with open(文件路径/文件名.文件后缀,mode="w",encoding="utf-8")as f:
f.write(要写入的内容)
with f = open(文件路径/文件名.文件后缀,mode="w",encoding="utf-8") as f:
f.write(要写入的内容)[
mode的可选项:
|-----|----------|
| "r" | 读取(默认) |
| "w" | 写入 |
| "a" | 追加写入 |
| "t" | 文本模式(默认) |
| "b" | 二进制模式 |
【beautifulsoup】静态页面解析
pip install beautifulsoup4(这个解析html标签,他和Selenium的区别是:这个处理静态页面,selenium可以处理动态渲染的,可以模拟用户操作,不过因为处理动态渲染的所以会慢点,虽然有无头模式)
python
import requests
from bs4 import BeautifulSoup
# 获取并解析网页
load_url = "......"
html=requests.get(load_url)
soup = BeautifulSoup(html.content,"html.parser")
print(soup)
#获取元素,也可以在已经获取的元素基础上继续找
# 找第一个元素,也可以使用id或者_class,例如sopu.find(id="") sopu.find(class_="")
元素 = soup.find("标签名,例如:h2") # 末尾加.text可以查找对应的文本字符串
# 找所有元素
for element in soup.find_all("......"):
print(element.text)
# 获取元素的属性element.get("属性名")
【urllib】url路径相关
按照参考地址转换绝对地址
python
import urllib
link_url=urllib.pares.urljoin("参考地址","查找地址")
【path】目录路径相关
新建文件夹、创建文件
python
from pathlib import path
# 新建文件夹
<文件夹> = path("文件夹路径/文件夹名称")
<文件夹>.mkdir(exits_ok=True)
# 创建访问文件夹的路径
<文件夹路径>.joinpath("文件夹名字")
【time】时间相关
增加等待时间
python
import time
time.sleep(1) #等待1秒
【pandas】读取操作csv
pip install pandas 可以去读表格数据,支持数据的添加、删除、提取、汇总、导出等操作。
python
import pandas as pd
# 读取csv文件
df=pd.read_csv("文件路径/文件名.csv")
df=pd.read_csv("文件路径/文件名.csv",encoding="gbk",index_col=0,dtype=str)
print(df)
# 获取相关数据信息
print(len(df)) # 数据条数
print(df.columns.values) #标题名
print(df.index.values) #索引
print(df.loc[行号]) # 单行数据 行号从0开始
print(df.loc[行号1,行号2] # 多行数据
print(df.loc[行号]["列名"]) # 单元格数据
# 注意:与目标数量要保持一致,不然会报错
df[列名]=[第1行元素,第2行元素,......]
df.loc[行号]=[元素1,元素2,......]
#删除数据
df.drop("列名",axis=1) # axis=1 表示删除列
df.drop(行号,axis=0) # axis=0 表示删除行
# 按条件筛选数据
df=df[df["列名"]>90]
df0=df[df["列名"]==""]
df1=df[df["列名"].str.contains("包含字符串XXX")]
print(df0["列名","列名",......])
# 统计相关
print(df[列名].max()] # 最大值
print(df[列名].min()] # 最小值
print(df[列名].mean()] # 平均值
print(df[列名].median()] # 中位数(根据值排序,取中间位置,取得时候不关心值)
print(df[列名].sum()] # 求和
print(df[列名].drop_duplicates()] # 去重
print(df[列名].drop_duplicates(["列名1","列名2"......])] # 根据贴数据去重
# 排序
df = df.sort_values("列名") # 升序,从小到大
df = df.sort_values("列名", ascending= False) # 降序,从大到小
# 转置(行列互换)
df.T
print(df.valuse)
# 将两个列数据得差作为新的列数据,支持列得四则运算
df["新的列名"]=df["列名1"]-df["列名2"]
# 将字符串列数据转换为时间类型,替换原始数据
df["列名"]=pd.to_datetime(df["列名"],format="格式字符串")
# 获取数据开头几行
df.head(行数)
# 设置索引
df=df.set_index("字段名")
# 输出文件
df.to_csv("文件名.csv")
df.to_csv("文件名.csv",index=False)
df.to_csv("文件名.csv",index=False,header=False)
|------|-----------------|------|
| 格式记号 | 含义 | 举例 |
| %Y | 四位数年份 | 2026 |
| %m | 两位数月份(用0补足) | 01 |
| %d | 两位数日期(用0补足) | 01 |
| %H | 两位小时数(24小时制) | 18 |
| %I | 两位小时数(12小时制) | 06 |
| %M | 两位分钟数 | 01 |
| %S | 两位秒数 | 01 |
| %p | 上午(AM) 或者下午(PM) | AM |
【matplotlib】绘制图表
pip install matplotlib 绘制图表相关
可以通过pandas读取数据,之后使用pandas得plot函数绘制图表(它实际调用了matplotlib得功能),使用matplotlib得shw来显示绘制好得图表。
python
import pandas as pd
import matplotlib.pyplot as plt
# 为图表设置默认字体(不然会报错)
plt.rcParams['font.family']=['Microsoft YaHei','sans-serif']
#读取csv文件
df=pd.read_csv("csv得文件路径")
# 绘制并显示柱状图
colorlist = ["skyblue","steelblue","tomato","cadetblue","orange","sienna"]
df.plot.bat()
df.plot.bat(color = colorlist) # 设置列表颜色
df.T.plot.bar() # 加了.T 就可以呼唤行列
df.T.plot.bar(color = colorlist) # 设置列表颜色
plt.legend(loc="lower right") # 图例显示在右下角
plt.show()
plt.savefig("文件名.png") # 把图表保存为图片
# 绘制并显示水平柱状图(条形图)
df.plot.barh()
plt.legend(loc="lower left") # 图例显示在左下角
plt.show()
# 绘制并显示堆叠柱状图
df.plet.bar(stacked=True)
plt.legend(loc="lower right")
plt.show()
# 绘制并显示箱线图
df.plot.box()
plt.show()
# 绘制并显示面积图
df.plot.area()
plt.legend(loc="lower right")
plt.show()
# 绘制饼图(一行一列)多列可以[[列名1,列名2,......]]
df.loc["列名"].plot.pie(labeldistance=0.6) # labeldistance标签到中心得距离
# 放大尺寸
df.plot(figsize=(15,8)
# 设置最大值和最小值
plt.ylim(0,100)
#绘制并显示
df.plot()
df.plot(label="列名")
plt.show()
|------------|-------|-------------------------------------|
| 目的 | 图表得种类 | 用法 |
| 观察数据得变化 | 折线图 | df.plot.bar() |
| 比较数值得大小 | 柱状图 | df.plot.barh() |
| 分析数值变化得原因 | 堆叠柱状图 | df.plot.bar(stacked=True) |
| 观察数据占整体得比例 | 饼图 | df.plot.pie(labeldistance=标签到中心得距离) |
| 观察数据得分散程度 | 箱线图 | df.plot.box() |
| 强调变化得大小 | 面积图 | df.plot.area() |
【openpyxl】处理Excel文件
pip install openpyxl xlrd xlwt 可以配合
python
df=pd.read_excel("读取得文件名.xlsx")
df=pd.read_excel("读取得文件名.xlsx",sheet_name="工作表名")
df.to_excel("输出得文件名.xlsx")
df.to_excel("输出得文件名.xlsx",index=False)
df.to_excel("输出得文件名.xlsx",sheet_name="工作表名")
# 将多个工作表输出为一个excel
with pd.ExcelWrite("输出得文件名.xlsx") as writer:
df.to_excel(writer,sheet_name="工作表名1")
df.to_excel(writer,sheet_name="工作表名2")
【json】处理json格式数据
python
import json
import requests
url="......"
# 从api获取json
jsondata =requests.get(url),json()
# 从文件获取json
with open("文件名.json",mode="r",encoding="utf-8") as f:
jsondata = json.loads(f.read())
print(jsondata[0])
print(jsondata[0]["key"])
【pprint】格式化json
python
import json
import requests
from pprint import pprint
url="......"
# 从api获取json
jsondata =requests.get(url),json()
# 从文件获取json
with open("文件名.json",mode="r",encoding="utf-8") as f:
jsondata = json.loads(f.read())
pprint(jsondata)
print(jsondata[0])
print(jsondata[0]["key1"]["key2"])
[datetime]时间戳|北京时间|世界时间
python
from datetime import datetime,UTC
timestamp=具体得时间戳数值
# 将时间戳转为北京时间
bjt = datetime.fromtimestamp(timestamp)
# 将时间戳转为世界时间
utc = datetime,fromtimestamp(timestamp,UTC)