Python学习笔记(四) 爬取网站数据(静态,动态)
时间:2022-07-26
本文章向大家介绍Python学习笔记(四) 爬取网站数据(静态,动态),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Python学习笔记(四) 爬取网站数据(静态,动态)
1. 知识点
-
threading
:python3
版本之后的新线程函数 -
requests
: 自带函数,用于请求网络地址 -
os
: 自带函数,用于操作文件相关 -
openpyxl
: 开源第三方的excel导出的库,需要手动下载pip install openpyxl -
BeautifulSoup
:html
代码美化工具
2. 基本函数的使用
2.1 网站静态数据爬取(需要熟悉h5标签元素选择器)
- 访问网站之后通过页面审查元素的方式,查看
Element
部分
- 找到你想爬取的内容部分,记录改内容的最外层标签元素或者类名
# -*- coding:UTF-8 -*-
import requests,sys
from bs4 import BeautifulSoup
class downloader(object):
def __init__(self):
self.server = 'http://bodboy.gitee.io/'
self.target = 'http://bodboy.gitee.io/blog/'
self.names = []
self.urls =[]
self.nums = 0
def getUrls(self):
req = requests.get(url=self.target)
req.encoding ='utf-8'
html = req.text
div = BeautifulSoup(html)
div_list = div.find_all('header' ,class_ ='article-header')
self.nums = len(div_list)
for each in div_list:
list_url = each.find_all('a' ,class_ ='article-title')
print(list_url)
url = list_url[0]
self.urls.append(self.server + url.get('href'))
self.names.append(url.string)
def write(self ,name ,path ,text):
write_flag = True
with open(path,'a',encoding='utf-8') as f:
f.writelines(text)
f.write('nn')
if __name__ == "__main__":
dl = downloader()
dl.getUrls()
print("开始下载文件....")
for i in range(dl.nums):
dl.write(dl.names[i], '博客文件.txt',dl.names[i] + 'r' + dl.urls[i])
sys.stdout.write('已下载:%.3f%%' % float(i/dl.nums) + 'r')
sys.stdout.flush()
print('文件下载完成')
- 运行文件
2.2 网站动态数据爬取(爬取接口数据)
- 实际上就是调用接口的形式,拿去接口中的数据,按照你想要的方式展示 例如,这个是拿网站某个接口数据,导出指定数据并下载图片
import threading
import requests
import os
from openpyxl import Workbook
class capturePc():
def __init__(self):
# 接口地址
self.base_url = 'http://api.newibao.com/web/essay/publicEssayList'
# 参数
self.params ={
'page':1,
'size':64
}
# 模拟浏览器 如果需要登录 记上session 需要添加 token
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
'Accept-Encoding': 'gzip, deflate'
}
def get_list(self):
req = requests.get(url=self.base_url,headers=self.headers,params=self.params)
# 数据转换
data = req.json()
print()
try :
if data['data']['list'] :
data = data['data']['list']
return data
except :
print("no data find")
return None
def get_img_list(self):
res = self.get_list()
imgUrls = []
if res :
for e in res :
if e['picUrl']:
urls = e['picUrl']
imgUrls += urls
print("图片列表为:",imgUrls)
return imgUrls
def get_excel_data(self):
res = self.get_list()
excel_list =[]
if res :
for e in res:
cell = [e['addTime'],e['brief'],e['columnName'],e['details'],e['name'],e['updateTime']]
excel_list.append(cell)
print(excel_list)
return excel_list
def download_img(self,name):
# 判断是否有文件夹
if not os.path.exists(name):
os.mkdir(name)
print("文件夹{}创建成功".format(name))
imgList = self.get_img_list()
names =0
if imgList :
for i in imgList:
names += 1
threading.Thread(target=self.download, args=(names, i,name)).start()
def download(self,name,image_url,path):
print('开始下载:', name)
content = requests.get(image_url).content
path = '%s/%s.jpg' % (path, name)
with open(path, 'wb') as f:
f.write(content)
print('下载完成', name)
def export_excel(self):
# 创建 文件对象
wb = Workbook()
# 设置excel名称
data_fileName = '蓝海图文数据.xlsx'
# 新建一个表
ws = wb.active
# 设置表头
header =['创建时间','标题','分类','详情','名称','更新时间']
for row in range(len(header)):
c = row +1
ws.cell(row=1, column = c,value =header[row])
# 填写表中内容
listIndex = self.get_excel_data()
if listIndex :
for imn in range(len(listIndex)):
ws.append(listIndex[imn])
wb.save(filename = data_fileName)
print("写入成功")
if __name__ == "__main__":
a = capturePc()
# filename = str(input('请输入文件名,必须为英文名称'))
a.export_excel()
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用Python的Numpy求解线性方程组
- python用于NLP的seq2seq模型实例:用Keras实现神经机器翻译
- 使用Python和Keras进行主成分分析、神经网络构建图像重建
- python使用Flask,Redis和Celery的异步任务
- 在R语言中进行缺失值填充:估算缺失值
- Docsify 如何添加目录列表
- Dubbo日志链路追踪TraceId选型
- 重温C++的设计思想
- 设计一个网站(域名)的镜像
- LoRa终端设备ASR6505普通GPIO操作
- LoRa终端设备ASR6505之I2C通信
- 我在暴躁同事小张的胁迫下学会了Go的交叉编译和条件编译
- LoRa终端设备ASR6505之PingPong通信
- LoRa点对点通信,OLED显示(内附代码)
- 08 . Python3高阶函数之迭代器、装饰器