爬虫基础与案例1

爬虫

爬虫:通过编写程序模拟浏览器上网,然后让其在互联网上抓取数据
爬虫分类:
	通用爬虫:爬取一整张页面数据进行爬取
	功能爬虫:selenium
	增量式:检测网站数据的更新情况
	分布式:
	
编码流程:
	1.指定url
	2.发起请求
	3.获取响应数据
	4.持久化存储
requests模块:
作用:模拟浏览器发起请求
编码流程:
	1.指定url
	2.发起请求
	3.获取响应数据
	4.持久化存储
	 
scrapy框架

爬取搜狗首页

import requests

url = 'https://www.sogou.com/'

response = requests.get(url)

page_text = response.text #返回字符串形式的数据

print(page_text)

with open('./sogou.html','w',encoding='utf-8') as fp:
	fp.write(page_text)
实现一个简易的网页采集器
  • 异常的访问请求:只要不是浏览器发起的请求

  • 请求头:User-Agent

    • 请求载体的身份标识

    • User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
      
  • 反爬机制:UA检测
  • 反反爬策略:UA伪装
import requests
headers = { #伪装的头信息
	'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
url = 'https://www.sogou.com/web?query=Python'

response = requests.get(url,headers=headers) #携带了指定好头信息进行的请求发送

page_text = response.text #返回字符串形式的数据

print(page_text)

with open('./sogou.html','w',encoding='utf-8') as fp:
	fp.write(page_text)
参数动态化
import requests
headers = { #伪装的头信息
	'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
#参数动态化
wd = input('enter a key word:')
params = {
	'query':wd
}
url = 'https://www.sogou.com/web'

response = requests.get(url,headers=headers,params=params) #携带了指定的请求参数进行的请求发送

page_text = response.text #返回字符串形式的数据

print(page_text)

with open('./sogou.html','w',encoding='utf-8') as fp:
	fp.write(page_text)
动态加载数据:只要不是通过浏览器地址栏的url请求到的数据
  • 如果对一个陌生的网站进行数据爬取的第一步操作:
    • 监测你想要的数据是否为动态加载数据
  • 如何监测数据是否为动态加载?
    • 基于抓包工具进行局部搜索
  • 如何捕获动态加载数据?
    • 基于抓包工具进行全局搜索
  • 动态爬取豆瓣电影数据
  • https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=
import requests
headers = { #伪装的头信息
	'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
url = 'https://movie.douban.com/j/chart/top_list'
start = input('enter a start:')
params = {
	'type': '5',              #请求参数复制过来加引号
	'interval_id': '100:90',#请求参数复制过来加引号
	'action': '',#请求参数复制过来加引号
	'start': int(start),#请求参数复制过来加引号
	'limit': '20'#请求参数复制过来加引号
}

movie_data = requests.get(url=url,headers=headers,params=params).json() #直接返回序列化好的数据

for dic in movie_data:
	name = dic['title']
	score = dic['score']
	print(name,score)
enter a start:1
这个杀手不太冷 9.4
切腹 9.4
指环王3:王者无敌 9.3
七武士 9.3
蝙蝠侠:黑暗骑士 9.2
指环王2:双塔奇兵 9.2
赛文奥特曼 我是地球人 9.2
丝路花雨 9.2
少年骇客:变身之谜 9.2
指环王1:护戒使者 9.1
黑客帝国 9.1
将军号 9.1
鬼灭之刃 那田蜘蛛山篇 9.1
搏击俱乐部 9.0
攻壳机动队 9.0
用心棒 9.0
让子弹飞 8.9
V字仇杀队 8.9
杀人回忆 8.9
勇敢的心 8.9

post请求

爬取指定城市的肯德基餐厅位置信息

http://www.kfc.com.cn/kfccda/storelist/index.aspx

import requests
headers = { #伪装的头信息
	'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'

data = {
	'pid': '',
	'keyword': '上海',
	'cname': '',
	'pageIndex': '1',
	'pageSize': '15'
}

pos_data = requests.post(url=url,headers=headers,data=data).json()

print(pos_data)
C:\Python\Python36\python.exe C:/Users/learn/爬虫/main.py
{'Table': [{'rowcount': 51}], 'Table1': [{'rownum': 1, 'storeName': '开发区上海路', 'addressDetail': '开发区上海路80号利群时代超市一楼', 'pro': '礼品卡', 'provinceName': '江苏省', 'cityName': '南通市'}, {'rownum': 2, 'storeName': '太仓新区东亭路', 'addressDetail': '太仓市娄江路与县府街交叉口西南侧(太仓新区上海路北、东亭路东地块)万达广场', 'pro': '礼品卡', 'provinceName': '江苏省', 'cityName': '苏州市'}, {'rownum': 3, 'storeName': '动力南广场(汇金奥特莱斯B1层)', 'addressDetail': '石龙路750-3号上海南站地下商场南馆', 'pro': '礼品卡', 'provinceName': '上海市', 'cityName': '上海市'}, {'rownum': 4, 'storeName': '南广场', 'addressDetail': '秣陵路303号上海火车站西南出口一侧', 'pro': '礼品卡', 'provinceName': '上海市', 'cityName': '上海市'}, {'rownum': 5, 'storeName': '北广场', 'addressDetail': '秣陵路303号上海站北广场北立面1F大厅入口西侧位置', 'pro': None, 'provinceName': '上海市', 'cityName': '上海市'}, {'rownum': 6, 'storeName': '南站精选(火车站站内)', 'addressDetail': '沪闵路9001号上海南站候车大厅', 'pro': '礼品卡', 'provinceName': '上海市', 'cityName': '上海市'}, {'rownum': 7, 'storeName': '上海滩', 'addressDetail': '佘山林湖路888号-1上海滩区5号', 'pro': '礼品卡', 'provinceName': '上海市', 'cityName': '上海市'}, {'rownum': 8, 'storeName': '动力南精选(3号线2号出口)', 'addressDetail': '沪闵路9001号上海南站(1F三角地A-1)一层', 'pro': '礼品卡', 'provinceName': '上海市', 'cityName': '上海市'}, {'rownum': 9, 'storeName': '上海南路', 'addressDetail': '青山湖区上海路3号', 'pro': '礼品卡', 'provinceName': '江西省', 'cityName': '南昌市'}, {'rownum': 10, 'storeName': '亦庄上海沙龙', 'addressDetail': '经济技术开发区天宝园五里二区A1+A2户一层', 'pro': '礼品卡', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 11, 'storeName': '三和', 'addressDetail': '8100425-沂蒙路与上海路交汇处颐高上海街一期铺位258、259号两层', 'pro': '礼品卡', 'provinceName': '山东省', 'cityName': '临沂市'}, {'rownum': 12, 'storeName': '上海城84832861', 'addressDetail': '人民西路93号1、2层', 'pro': '礼品卡', 'provinceName': '江苏省', 'cityName': '泰州市'}, {'rownum': 13, 'storeName': '沭阳大润发', 'addressDetail': '上海南路与苏州西路交汇处', 'pro': '礼品卡', 'provinceName': '江苏省', 'cityName': '宿迁市'}, {'rownum': 14, 'storeName': '上海路', 'addressDetail': '上海路四段二号', 'pro': '礼品卡', 'provinceName': '辽宁省', 'cityName': '锦州市'}, {'rownum': 15, 'storeName': '上海乳山餐厅', 'addressDetail': '乳山路136号', 'pro': '礼品卡,溯源', 'provinceName': '上海市', 'cityName': '上海市'}]}

进程已结束,退出代码为 0

药监总局数据采集

http://scxk.nmpa.gov.cn:81/xk/

分析:

  • 某一家企业的详情页,查看企业详情数据是否为动态加载数据?

    • 基于抓包工具的局部搜索监测数据是否为动态加载数据?(是动态加载数据)
  • 捕获动态加载数据:

    • 基于抓包工具进行全局搜索:定位到了动态加载数据对应的数据包,从数据包中可以提取出:
      • 请求的url: http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
      • 请求参数:id: c075e6b3e4424098983e9506a550a330
        • 注意该请求参数的值是否为动态变化。
      • 请求方法:POST
  • 一家企业对应的详情数据实现:

import requests
headers = { #伪装的头信息
	'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
data = {
	'id':'03df988d3cf44c9e97efda8af61b2c89'
}
detail_company = requests.post(url=url,headers=headers,data=data).json()
print(detail_company)
C:\Python\Python36\python.exe C:/Users/learn/爬虫/main.py
{'businessLicenseNumber': '91410400352018765Y', 'businessPerson': '张坤阳', 'certStr': '一般液态单元(啫喱类、护发清洁类、护肤水类);膏霜乳液单元(护发类、护肤清洁类);粉单元(浴盐类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '河南省平顶山市市辖区高新区神马大道666号高新火炬园9号厂房', 'epsName': '河南天葵生物科技有限公司', 'epsProductAddress': '河南省平顶山市市辖区高新区神马大道666号高新火炬园9号厂房', 'id': '', 'isimport': 'N', 'legalPerson': '张坤阳', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '20210817154953202yhshy', 'productSn': '豫妆20160051', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '河南省食品药品监督管理局', 'qualityPerson': '马少敏', 'rcManagerDepartName': '平顶山市食品药品监督管理局高新技术产业开发区分局', 'rcManagerUser': '宗红兵、陈军', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-12-31', 'xkDateStr': '2021-12-31', 'xkName': '刘启波', 'xkProject': '', 'xkRemark': '', 'xkType': '202'}

进程已结束,退出代码为 0

获取多家企业的详情数据
  • 请求参数id的值就是用来标识不同企业的

    • 如果可以获取多家企业对应的id值,则可以批量捕获到多家企业的企业详情数据
  • 如何获取多家企业对应的id

    • 可以在首页的页面源码中找寻企业的id数据
      • 发现:首页中对应的企业信息数据也是动态加载的。
      • 动过抓包工具的全局搜索定位到了动态加载数据的数据包,从中找到了不同企业的id值
      • url: http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList
      • 请求方式:POST
      • 请求参数:6个请求参数
  • 完整代码:

    import requests
    headers = { #伪装的头信息
    	'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
    }
    for page in range(1,6):
    	data = {
    		'on': 'true',
    		'page': str(page),
    		'pageSize': '15',
    		'productName': '',
    		'conditionType': '1',
    		'applyname': '',
    		'applysn':''
    	}
    	main_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
    	json_data = requests.post(url=main_url,headers=headers,data=data).json()
    	for dic in json_data['list']:
    		_id = dic['ID']
    
    		url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
    		data = {
    			'id':_id
    		}
    		detail_company = requests.post(url=url,headers=headers,data=data).json()
    		print(detail_company)
    
C:\Python\Python36\python.exe C:/Users/learn/爬虫/main.py
{'businessLicenseNumber': '91410400352018765Y', 'businessPerson': '张坤阳', 'certStr': '一般液态单元(啫喱类、护发清洁类、护肤水类);膏霜乳液单元(护发类、护肤清洁类);粉单元(浴盐类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '河南省平顶山市市辖区高新区神马大道666号高新火炬园9号厂房', 'epsName': '河南天葵生物科技有限公司', 'epsProductAddress': '河南省平顶山市市辖区高新区神马大道666号高新火炬园9号厂房', 'id': '', 'isimport': 'N', 'legalPerson': '张坤阳', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '20210817154953202yhshy', 'productSn': '豫妆20160051', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '河南省食品药品监督管理局', 'qualityPerson': '马少敏', 'rcManagerDepartName': '平顶山市食品药品监督管理局高新技术产业开发区分局', 'rcManagerUser': '宗红兵、陈军', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-12-31', 'xkDateStr': '2021-12-31', 'xkName': '刘启波', 'xkProject': '', 'xkRemark': '', 'xkType': '202'}
{'businessLicenseNumber': '91350200776045513K', 'businessPerson': '刘吉昌', 'certStr': '一般液态单元(啫喱类、护发清洁类、护肤水类);膏霜乳液单元(护发类、护肤清洁类);粉单元(块状粉类、散粉类);蜡基单元(蜡基类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '厦门市同安区西福路69号(3#厂房、7#厂房)', 'epsName': '厦门上新日用化学制品有限公司', 'epsProductAddress': '厦门市同安区西福路69号(3#厂房、7#厂房)', 'id': '', 'isimport': 'N', 'legalPerson': '林逸仪', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '20210618131926202stsfi', 'productSn': '闽妆20160016', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '福建省药品监督管理局', 'qualityPerson': '刘吉昌', 'rcManagerDepartName': '厦门市市场监督管理局', 'rcManagerUser': '王春明;金剑华', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-10-18', 'xkDateStr': '2021-10-18', 'xkName': '俞开海', 'xkProject': '', 'xkRemark': '', 'xkType': '202'}
{'businessLicenseNumber': '9112011666881838X9', 'businessPerson': '宇佐美文雄', 'certStr': '一般液态单元(啫喱类、护发清洁类、护肤水类);膏霜乳液单元(护肤清洁类);蜡基单元(蜡基类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '天津自贸试验区(空港经济区)西九道30号', 'epsName': '伊势半(天津)化妆品有限公司', 'epsProductAddress': '天津自贸试验区(空港经济区)西九道30号', 'id': '', 'isimport': 'N', 'legalPerson': '宇佐美文雄', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '20210824111825202g376h', 'productSn': '津妆20160008', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '天津市市场和质量监督管理委员会', 'qualityPerson': '刘兴达', 'rcManagerDepartName': '天津市药品监督管理局', 'rcManagerUser': '马小溪 孙静', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-09-11', 'xkDateStr': '2021-09-11', 'xkName': '张胜昔', 'xkProject': '', 'xkRemark': '', 'xkType': '202'}
{'businessLicenseNumber': '91533421594553808C', 'businessPerson': '孙楠', 'certStr': '粉单元(散粉类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '香格里拉市建塘镇康定路55号', 'epsName': '香格里拉市甘露生物资源有限公司', 'epsProductAddress': '香格里拉市建塘镇康定路55号', 'id': '', 'isimport': 'N', 'legalPerson': '聂鹏飞', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '20210712110428202648ej', 'productSn': '云妆20160008', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '云南省食品药品监督管理局', 'qualityPerson': '柏玛丹增', 'rcManagerDepartName': '云南省药品监督管理局', 'rcManagerUser': '宋绍华、吴羽', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-08-28', 'xkDateStr': '2021-08-28', 'xkName': '琚健', 'xkProject': '', 'xkRemark': '', 'xkType': '202'}
{'businessLicenseNumber': '91441802MA4UHUME0F', 'businessPerson': '王天雷', 'certStr': '一般液态单元(护发清洁类、护肤水类、啫喱类);膏霜乳液单元(护肤清洁类、护发类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '清远市清城区龙塘镇新庄长冲S253线毅力工业城第5幢厂房B座五层', 'epsName': '清远市伯堂生物科技有限公司', 'epsProductAddress': '清远市清城区龙塘镇新庄长冲S253线毅力工业城第5幢厂房B座五层', 'id': '', 'isimport': 'Y', 'legalPerson': '王天雷', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '', 'productSn': '粤妆20161310', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '广东省药品监督管理局', 'qualityPerson': '覃雄锦', 'rcManagerDepartName': '清城区食品药品监督管理局', 'rcManagerUser': '黄均万、陈炽勇', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-08-26', 'xkDateStr': '2021-08-27', 'xkName': '苏盛锋', 'xkProject': '', 'xkRemark': '无', 'xkType': '206'}
{'businessLicenseNumber': '91440514666450083A', 'businessPerson': '唐克宣', 'certStr': '一般液态单元(护发清洁类、护肤水类、啫喱类);膏霜乳液单元(护肤清洁类、护发类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '汕头市潮南区峡山街道莲青克岐路40、42号', 'epsName': '汕头市莲达旅游用品实业有限公司', 'epsProductAddress': '汕头市潮南区峡山街道莲青克岐路40、42号', 'id': '', 'isimport': 'Y', 'legalPerson': '唐克宣', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '', 'productSn': '粤妆20161264', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '广东省药品监督管理局', 'qualityPerson': '唐伟生', 'rcManagerDepartName': '汕头市潮南区市场监督管理局', 'rcManagerUser': '由日常监督管理机构指定(F)', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-08-26', 'xkDateStr': '2021-08-27', 'xkName': '苏盛锋', 'xkProject': '', 'xkRemark': '无', 'xkType': '206'}
{'businessLicenseNumber': '91510183MA6CNGNM4R', 'businessPerson': '陈大春', 'certStr': '一般液态单元(护肤水类);膏霜乳液单元(护肤清洁类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '邛崃市天府新区邛崃产业园区羊横六路一号附2号', 'epsName': '四川暨康生物医药科技有限公司', 'epsProductAddress': '邛崃市天府新区邛崃产业园区羊横六路一号附2号', 'id': '', 'isimport': 'N', 'legalPerson': '谭莉', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '20210826133850206gpfrs', 'productSn': '川妆20210005', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '四川省药品监督管理局', 'qualityPerson': '刘萍', 'rcManagerDepartName': '四川省药品监督管理局', 'rcManagerUser': '职能处室相关人员', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-06-20', 'xkDateStr': '2021-08-27', 'xkName': '曾继奎', 'xkProject': '', 'xkRemark': '', 'xkType': '206'}
{'businessLicenseNumber': '91440101MA9XTXPD7Q', 'businessPerson': '刘彬彬', 'certStr': '一般液态单元(护发清洁类、护肤水类、啫喱类);膏霜乳液单元(护肤清洁类、护发类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '广州市花都区先科一路9号之三401房', 'epsName': '广州婉美药业有限公司', 'epsProductAddress': '广州市花都区先科一路9号之三401房', 'id': '', 'isimport': 'Y', 'legalPerson': '刘彬彬', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '', 'productSn': '粤妆20210238', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '广东省药品监督管理局', 'qualityPerson': '彭钢', 'rcManagerDepartName': '/', 'rcManagerUser': '/', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-08-25', 'xkDateStr': '2021-08-26', 'xkName': '苏盛锋', 'xkProject': '', 'xkRemark': '无', 'xkType': '201'}
{'businessLicenseNumber': '91440512MA4UTWRT6M', 'businessPerson': '吴茂德', 'certStr': '一般液态单元(护发清洁类、护肤水类、啫喱类);膏霜乳液单元(护肤清洁类、护发类);粉单元(散粉类、块状粉类);气雾剂及有机溶剂单元(有机溶剂类);蜡基单元(蜡基类);牙膏单元(牙膏类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '汕头市濠江区三联工业区厂房A栋', 'epsName': '奥俐莱雅(广东)家化科技有限公司', 'epsProductAddress': '汕头市濠江区三联工业区厂房A栋', 'id': '', 'isimport': 'Y', 'legalPerson': '吴茂德', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '', 'productSn': '粤妆20170397', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '广东省药品监督管理局', 'qualityPerson': '杨浙洪', 'rcManagerDepartName': '汕头市濠江区市场监督管理局', 'rcManagerUser': '由日常监督管理机构指定(Y)', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-08-25', 'xkDateStr': '2021-08-26', 'xkName': '苏盛锋', 'xkProject': '', 'xkRemark': '无', 'xkType': '206'}
{'businessLicenseNumber': '914401117733232236', 'businessPerson': '胡本剑', 'certStr': '一般液态单元(护发清洁类、护肤水类、啫喱类);膏霜乳液单元(护肤清洁类、护发类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '广州市白云区白云湖夏花一路277号之十幢', 'epsName': '广州天斯秀尔化妆品有限公司', 'epsProductAddress': '广州市白云区白云湖夏花一路277号之十幢(一楼、201、三楼)', 'id': '', 'isimport': 'Y', 'legalPerson': '胡本剑', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '', 'productSn': '粤妆20161351', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '广东省药品监督管理局', 'qualityPerson': '胥家瑶', 'rcManagerDepartName': '白云区局白云湖食品药品监督管理所', 'rcManagerUser': '阮家兴、陈昕锋', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-08-25', 'xkDateStr': '2021-08-26', 'xkName': '苏盛锋', 'xkProject': '', 'xkRemark': '无', 'xkType': '206'}
{'businessLicenseNumber': '914401113044272067', 'businessPerson': '夏伟', 'certStr': '一般液态单元(护发清洁类、护肤水类、啫喱类);膏霜乳液单元(护肤清洁类、护发类);粉单元(散粉类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '广州市白云区嘉禾街新科科甲商业路3号1-4楼(自主申报)', 'epsName': '广州盛妍精细化工有限公司', 'epsProductAddress': '广州市白云区嘉禾街新科科甲商业路3号1-4楼', 'id': '', 'isimport': 'Y', 'legalPerson': '王绪林', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '', 'productSn': '粤妆20161328', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '广东省药品监督管理局', 'qualityPerson': '张展群', 'rcManagerDepartName': '白云区局嘉禾市场监管所', 'rcManagerUser': '监管机构指定人员', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-08-25', 'xkDateStr': '2021-08-26', 'xkName': '苏盛锋', 'xkProject': '', 'xkRemark': '无', 'xkType': '206'}
{'businessLicenseNumber': '91440111786087928M', 'businessPerson': '许东英', 'certStr': '一般液态单元(护发清洁类、护肤水类、啫喱类);膏霜乳液单元(护肤清洁类、护发类);粉单元(散粉类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '广州市白云区龙河西北横一路8号厂房', 'epsName': '广州吉呈化妆品有限公司', 'epsProductAddress': '广州市白云区龙河西北横一路8号厂房', 'id': '', 'isimport': 'Y', 'legalPerson': '张建', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '', 'productSn': '粤妆20161326', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '广东省药品监督管理局', 'qualityPerson': '马善坤', 'rcManagerDepartName': '白云区局太和食品药品监督管理所', 'rcManagerUser': '任卫红、黄礼杰', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-08-25', 'xkDateStr': '2021-08-26', 'xkName': '苏盛锋', 'xkProject': '', 'xkRemark': '无', 'xkType': '206'}
{'businessLicenseNumber': '9144130307354026XE', 'businessPerson': '吴秋玲', 'certStr': '一般液态单元(护肤水类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '惠阳区淡水石桥管理区熊老屋规划区(附属楼)二楼', 'epsName': '惠州市乐得伦化妆品有限公司', 'epsProductAddress': '惠阳区淡水石桥管理区熊老屋规划区(附属楼)二楼', 'id': '', 'isimport': 'Y', 'legalPerson': '吴秋玲', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '', 'productSn': '粤妆20161162', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '广东省药品监督管理局', 'qualityPerson': '吴秋玲', 'rcManagerDepartName': '///', 'rcManagerUser': '///', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2021-11-15', 'xkDateStr': '2021-08-26', 'xkName': '苏盛锋', 'xkProject': '', 'xkRemark': '无', 'xkType': '206'}
{'businessLicenseNumber': '91440111749938236T', 'businessPerson': '罗友军', 'certStr': '一般液态单元(护发清洁类、护肤水类、啫喱类);膏霜乳液单元(护肤清洁类、护发类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '广州市白云区新市罗岗村第七经济社工业区厂房(土名红珠岭)', 'epsName': '广州由美化妆品有限公司', 'epsProductAddress': '广州市白云区新市罗岗村第七经济社工业区', 'id': '', 'isimport': 'Y', 'legalPerson': '罗友军', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '', 'productSn': '粤妆20161154', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '广东省药品监督管理局', 'qualityPerson': '陈桓林', 'rcManagerDepartName': '白云区局均禾食品药品监督管理所', 'rcManagerUser': '赖成旭、何文健', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-08-25', 'xkDateStr': '2021-08-26', 'xkName': '苏盛锋', 'xkProject': '', 'xkRemark': '无', 'xkType': '206'}
{'businessLicenseNumber': '914401147264984421', 'businessPerson': '胡炎坤', 'certStr': '一般液态单元(护发清洁类、护肤水类、啫喱类);膏霜乳液单元(护肤清洁类、护发类)', 'cityCode': '', 'countyCode': '', 'creatUser': '', 'createTime': '', 'endTime': '', 'epsAddress': '广州市花都区花东镇金田工业园花都大道自编8号', 'epsName': '广东芙妍化妆品有限公司', 'epsProductAddress': '广州市花都区花东镇金田工业园花都大道自编8号', 'id': '', 'isimport': 'Y', 'legalPerson': '胡炎坤', 'offDate': '', 'offReason': '', 'parentid': '', 'preid': '', 'processid': '', 'productSn': '粤妆20161077', 'provinceCode': '', 'qfDate': '', 'qfManagerName': '广东省药品监督管理局', 'qualityPerson': '黄中书', 'rcManagerDepartName': '花都区局花东食品药品监管所', 'rcManagerUser': '秦余德、郑宏华', 'startTime': '', 'warehouseAddress': '', 'xkCompleteDate': None, 'xkDate': '2026-08-25', 'xkDateStr': '2021-08-26', 'xkName': '苏盛锋', 'xkProject': '', 'xkRemark': '无', 'xkType': '206'}

进程已结束,退出代码为 0

  • 图片数据爬取

    • 图片,音频,视频,压缩包…都是bytes类型的数据。
import requests
headers = { #伪装的头信息
	'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
img_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcdn.duitang.com%2Fuploads%2Fitem%2F201207%2F22%2F20120722075151_s88n2.jpeg&refer=http%3A%2F%2Fcdn.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631672324&t=6d07bdf1b5b5ec94c94cc1a035709158'

img_data = requests.get(url=img_url,headers=headers).content #返回byte类型的数据
with open('./123.jpg','wb') as fp:
	fp.write(img_data)
from urllib import request
img_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcdn.duitang.com%2Fuploads%2Fitem%2F201207%2F22%2F20120722075151_s88n2.jpeg&refer=http%3A%2F%2Fcdn.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631672324&t=6d07bdf1b5b5ec94c94cc1a035709158'

request.urlretrieve(img_url,'456.jpg')

###数据解析

  • 作用:实现聚焦爬虫
  • 方式:
    • 正则
    • bs4 (python独有)
    • xpath(其他语言也有)
    • pyquery
  • html的作用:展示数据
    • html展示的数据都是在那些位置:
      • 标签之间
      • 标签的属性值中
  • 数据解析的通用原理
    • 标签定位
    • 数据的提取
bs4使用:
  • 环境安装:pip install bs4

  • 解析流程:

    • 创建一个BeautifulSoup对象,然后把即将被解析的界面加载到该对象中

      • 1.soup = BeautifulSoup(fp,'lxml'):解析本地的html文档
        2.soup = BeautifulSoup(page_text,'lxml'):解析从互联网中请求到的数据
        
    • 调用该对象的相关方法和属性进行标签定位和数据提取

      • 标签定位:

        • soup.tagName:返回页面中第一次出现的tagName标签

        • 属性定位:

          • - find('tagName',attrName='value'):返回的是单数(只能定位到符合条件的第一个标签)
            - findall():用法同上,但是会返回符合条件的所有标签
            
        • 选择器定位:

          • soup.select('选择器')
            特殊的选择器:层级选择器
            	>:表示一个层级
            	空格:表示多个层级
            
      • 数据提取:
        • 取文本:

          • string:取出指定标签下直系的文本内容
          • text:取出指定标签下所有的文本内容(不管是不是直系)
        • 取属性:

          • tag[‘attrName’]
  • 三国演义数据爬取

  • import requests
    from bs4 import BeautifulSoup
    headers = { #伪装的头信息
    	'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
    }
    main_url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
    response = requests.get(main_url,headers=headers)
    response.encoding = 'utf-8' #处理中文乱码
    page_text = response.text
    #数据解析:章节名称,详情页url
    soup = BeautifulSoup(page_text,'lxml')
    a_list = soup.select('.book-mulu > ul > li > a')
    fp = open('./sanguo.txt','w',encoding='utf-8')
    for a in a_list:
    	detail_url = 'https://www.shicimingju.com'+a['href']
    	title = a.string
    	#解析详情页中的章节内容
    	response = requests.get(detail_url,headers=headers)
    	response.encoding = 'utf-8'
    	detail_page_text = response.text
    	detail_soup = BeautifulSoup(detail_page_text,'lxml')
    	div_tag = detail_soup.find('div',class_='chapter_content')
    	content = div_tag.text
    	fp.write(title+'\n'+content+'\n')
    	print(title,'成功保存!')
    
    fp.close()
    
C:\Python\Python36\python.exe C:/Users/learn/爬虫/main.py
第一回·宴桃园豪杰三结义  斩黄巾英雄首立功 成功保存!
第二回·张翼德怒鞭督邮    何国舅谋诛宦竖 成功保存!
第三回·议温明董卓叱丁原  馈金珠李肃说吕布 成功保存!
第四回·废汉帝陈留践位    谋董贼孟德献刀 成功保存!
第五回·发矫诏诸镇应曹公  破关兵三英战吕布 成功保存!
第六回·焚金阙董卓行凶    匿玉玺孙坚背约 成功保存!
第七回·袁绍磐河战公孙    孙坚跨江击刘表 成功保存!
第八回·王司徒巧使连环计  董太师大闹凤仪亭 成功保存!
第九回·除暴凶吕布助司徒  犯长安李傕听贾诩 成功保存!
第一十回·勤王室马腾举义    报父仇曹操兴师 成功保存!
第十一回·刘皇叔北海救孔融  吕温侯濮阳破曹操 成功保存!
第十二回·陶恭祖三让徐州    曹孟德大战吕布 成功保存!
第十三回·李傕郭汜大交兵  杨奉董承双救驾 成功保存!
第十四回·曹孟德移驾幸许都  吕奉先乘夜袭徐郡 成功保存!
第十五回·太史慈酣斗小霸王  孙伯符大战严白虎 成功保存!
第十六回·吕奉先射戟辕门    曹孟德败师淯水 成功保存!
第十七回·袁公路大起七军    曹孟德会合三将 成功保存!
第十八回·贾文和料敌决胜    夏侯惇拔矢啖睛 成功保存!
第十九回·下邳城曹操鏖兵    白门楼吕布殒命 成功保存!
第二十回·曹阿瞒许田打围    董国舅内阁受诏 成功保存!
第二十一回·曹操煮酒论英雄  关公赚城斩车胄 成功保存!
第二十二回·袁曹各起马步三军  关张共擒王刘二将 成功保存!
第二十三回·祢正平裸衣骂贼    吉太医下毒遭刑 成功保存!
第二十四回·国贼行凶杀贵妃    皇叔败走投袁绍 成功保存!
第二十五回·屯土山关公约三事  救白马曹操解重围 成功保存!
第二十六回·袁本初败兵折将    关云长挂印封金 成功保存!
第二十七回·美髯公千里走单骑  汉寿侯五关斩六将 成功保存!
第二十八回·斩蔡阳兄弟释疑    会古城主臣聚义 成功保存!
第二十九回·小霸王怒斩于吉    碧眼儿坐领江东 成功保存!
第三十回·战官渡本初败绩  劫乌巢孟德烧粮 成功保存!
第三十一回·曹操仓亭破本初    玄德荆州依刘表 成功保存!
第三十二回·夺冀州袁尚争锋    决漳河许攸献计 成功保存!
第三十三回·曹丕乘乱纳甄氏    郭嘉遗计定辽东 成功保存!
第三十四回·蔡夫人隔屏听密语  刘皇叔跃马过檀溪 成功保存!
第三十五回·玄德南漳逢隐沧    单福新野遇英主 成功保存!
第三十六回·玄德用计袭樊城    元直走马荐诸葛 成功保存!
第三十七回·司马徽再荐名士    刘玄德三顾草庐 成功保存!
第三十八回·定三分隆中决策    战长江孙氏报仇 成功保存!
第三十九回·荆州城公子三求计  博望坡军师初用兵 成功保存!
第四十回·蔡夫人议献荆州    诸葛亮火烧新野 成功保存!
第四十一回·刘玄德携民渡江    赵子龙单骑救主 成功保存!
第四十二回·张翼德大闹长坂桥  刘豫州败走汉津口 成功保存!
第四十三回·诸葛亮舌战群儒    鲁子敬力排众议 成功保存!
第四十四回·孔明用智激周瑜    孙权决计破曹操 成功保存!
第四十五回·三江口曹操折兵    群英会蒋干中计 成功保存!
第四十六回·用奇谋孔明借箭    献密计黄盖受刑 成功保存!
第四十七回·阚泽密献诈降书    庞统巧授连环计 成功保存!
第四十八回·宴长江曹操赋诗    锁战船北军用武 成功保存!
第四十九回·七星坛诸葛祭风    三江口周瑜纵火 成功保存!
第五十回·诸葛亮智算华容    关云长义释曹操 成功保存!
第五十一回·曹仁大战东吴兵    孔明一气周公瑾 成功保存!
第五十二回·诸葛亮智辞鲁肃    赵子龙计取桂阳 成功保存!
第五十三回·关云长义释黄汉升  孙仲谋大战张文远 成功保存!
第五十四回·吴国太佛寺看新郎  刘皇叔洞房续佳偶 成功保存!
第五十五回·玄德智激孙夫人    孔明二气周公瑾 成功保存!
第五十六回·曹操大宴铜雀台    孔明三气周公瑾 成功保存!
第五十七回·柴桑口卧龙吊丧    耒阳县凤雏理事 成功保存!
第五十八回·马孟起兴兵雪恨    曹阿瞒割须弃袍 成功保存!
第五十九回·许诸裸衣斗马超    曹操抹书问韩遂 成功保存!
第六十回·张永年反难杨修    庞士元议取西蜀 成功保存!
第六十一回·赵云截江夺阿斗    孙权遗书退老瞒 成功保存!
第六十二回·取涪关杨高授首    攻雒城黄魏争功 成功保存!
第六十三回·诸葛亮痛哭庞统    张翼德义释严颜 成功保存!
第六十四回·孔明定计捉张任    杨阜借兵破马超 成功保存!
第六十五回·马超大战葭萌关    刘备自领益州牧 成功保存!
第六十六回·关云长单刀赴会    伏皇后为国捐生 成功保存!
第六十七回·曹操平定汉中地    张辽威震逍遥津 成功保存!
第六十八回·甘宁百骑劫魏营    左慈掷杯戏曹操 成功保存!
第六十九回·卜周易管辂知机    讨汉贼五臣死节 成功保存!
第七十回·猛张飞智取瓦口隘  老黄忠计夺天荡山 成功保存!
第七十一回·占对山黄忠逸待劳  据汉水赵云寡胜众 成功保存!
第七十二回·诸葛亮智取汉中    曹阿瞒兵退斜谷 成功保存!
第七十三回·玄德进位汉中王    云长攻拔襄阳郡 成功保存!
第七十四回·庞令明抬榇决死战  关云长放水淹七军 成功保存!
第七十五回·关云长刮骨疗毒    吕子明白衣渡江 成功保存!
第七十六回·徐公明大战沔水    关云长败走麦城 成功保存!
第七十七回·玉泉山关公显圣    洛阳城曹操感神 成功保存!
第七十八回·治风疾神医身死    传遗命奸雄数终 成功保存!
第七十九回·兄逼弟曹植赋诗    侄陷叔刘封伏法 成功保存!
第八十回·曹丕废帝篡炎刘    汉王正位续大统 成功保存!
第八十一回·急兄仇张飞遇害    雪弟恨先主兴兵 成功保存!
第八十二回·孙权降魏受九锡    先主征吴赏六军 成功保存!
第八十三回·战猇亭先主得仇人  守江口书生拜大将 成功保存!
第八十四回·陆逊营烧七百里    孔明巧布八阵图 成功保存!
第八十五回·刘先主遗诏托孤儿  诸葛亮安居平五路 成功保存!
第八十六回·难张温秦宓逞天辩  破曹丕徐盛用火攻 成功保存!
第八十七回·征南寇丞相大兴师  抗天兵蛮王初受执 成功保存!
第八十八回·渡泸水再缚番王    识诈降三擒孟获 成功保存!
第八十九回·武乡侯四番用计    南蛮王五次遭擒 成功保存!
第九十回·驱巨善六破蛮兵    烧藤甲七擒孟获 成功保存!
第九十一回·祭泸水汉相班师    伐中原武侯上表 成功保存!
第九十二回·赵子龙力斩五将    诸葛亮智取三城 成功保存!
第九十三回·姜伯约归降孔明    武乡侯骂死王朝 成功保存!
第九十四回·诸葛亮乘雪破羌兵  司马懿克日擒孟达 成功保存!
第九十五回·马谡拒谏失街亭    武侯弹琴退仲达 成功保存!
第九十六回·孔明挥泪斩马谡    周鲂断发赚曹休 成功保存!
第九十七回·讨魏国武侯再上表  破曹兵姜维诈献书 成功保存!
第九十八回·追汉军王双受诛    袭陈仓武侯取胜 成功保存!
第九十九回·诸葛亮大破魏兵    司马懿入寇西蜀 成功保存!
第一百回·汉兵劫寨破曹真    武侯斗阵辱仲达 成功保存!
第一百十一回·出陇上诸葛妆神    奔剑阁张郃中计 成功保存!
第一百十二回·司马懿占北原渭桥  诸葛亮造木牛流马 成功保存!
第一百十三回·上方谷司马受困    五丈原诸葛禳星 成功保存!
第一百十四回·陨大星汉丞相归天  见木像魏都督丧胆 成功保存!
第一百十五回·武侯预伏锦囊计    魏主拆取承露盘 成功保存!
第一百十六回·公孙渊兵败死襄平  司马懿诈病赚曹爽 成功保存!
第一百十七回·魏主政归司马氏    姜维兵败牛头山 成功保存!
第一百十八回·丁奉雪中奋短兵    孙峻席间施密计 成功保存!
第一百十九回·困司马汉将奇谋    废曹芳魏家果报 成功保存!
第一百一十回·文鸯单骑退雄兵    姜维背水破大敌 成功保存!
第一百一十一回·邓士载智败姜伯约  诸葛诞义讨司马昭 成功保存!
第一百一十二回·救寿春于诠死节    取长城伯约鏖兵 成功保存!
第一百一十三回·丁奉定计斩孙綝    姜维斗阵破邓艾 成功保存!
第一百一十四回·曹髦驱车死南阙    姜维弃粮胜魏兵 成功保存!
第一百一十五回·诏班师后主信谗    托屯田姜维避祸 成功保存!
第一百一十六回·钟会分兵汉中道    武侯显圣定军山 成功保存!
第一百一十七回·邓士载偷度阴平    诸葛瞻战死绵竹 成功保存!
第一百一十八回·哭祖庙一王死孝    入西川二士争功 成功保存!
第一百一十九回·假投降巧计成虚话  再受禅依样画葫芦 成功保存!
第一百二十回·荐杜预老将献新谋  降孙皓三分归一统 成功保存!

进程已结束,退出代码为 0

xpath解析:
  • 环境安装:pip install lxml

  • 解析流程:

    • 1.实例化一个etree的对象,把即将被解析的页面源码加载到该对象
    • 2.调用该对象的xpath方法结合着不同形式的xpath表达进行标签定位和数据提取
  • 标签定位:

    • 最左侧的/:表示必须从根标签逐步向下定位其他字标签(绝对路径定位)
    • 非最左侧的/:表示一个层级
    • 非最左侧的//:表示多个层级
    • 最左侧的//:在任意位置定义指定的标签(相对路径定位)
    • 属性定位://tagName[@attrName=“value”]
    • 索引定位://tagName[index],索引是从1开始
  • 数据提取:

    • 取文本:
      • /text():取直系的文本内容
      • //text():取所有的文本内容
    • 取属性:
      • /@attrName
  • 糗事百科:

  • import requests
    from lxml import etree
    headers = { #伪装的头信息
    	'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
    }
    #通用的url模板
    url = 'https://www.qiushibaike.com/text/page/%d/'
    for page in range(1,6):
    	new_url = format(url%page)
    	page_text = requests.get(new_url,headers=headers).text
    	tree = etree.HTML(page_text)
    	div_list = tree.xpath('//*[@id="content"]/div/div[2]/div')
    	#局部解析: ./表示xpath的调用者对应的那个标签
    	for div in div_list:
    		author = div.xpath('./div[1]/a[2]/h2/text()')[0]
    		content = div.xpath('./a[1]/div/span//text()')
    		content = ''.join(content)
    		print(author,content)
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值