最近对爬虫感兴趣,写了个小小的爬虫程序
爬取信息代码:
import requests, wget, os
import urllib.request
from parsel import Selector as selector
class Anchor:
def __init__(self, url, path):
self.url = url
self.path = path
def askURL(self):
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"}
html = requests.get(self.url, headers=headers).text
return html
# 解析网页并提取关键信息
def get_datas(self):
dataList = []
parse = selector(Anchor.askURL(self)) # 使用parsel解析网页
lis = parse.xpath('//li[@class="game-live-item"]').getall() # 获取页面所有class="game-live-item" 的li
for li in lis:
data = []
parse1 = selector(li)
img = parse1.xpath('//img[@class="pic"]/@data-original').get() # 提取主播图片
title = parse1.xpath('//i[@class="nick"]/@title').get() # 提取主播名称
data.append(img)
data.append(title)
dataList.append(data)
return dataList
# 保存主播头像,去重
def download(self):
for data in Anchor.get_datas(self):
if 'http' in data[0]:
urllib.request.urlretrieve(data[0], self.path + "/" + data[1] + ".jpg")
print(data[1] + "下载完成")
else:
urllib.request.urlretrieve('http:' + data[0], self.path + "/" + data[1] + ".jpg")
print(data[1] + "下载完成")
# 保存主播头像,不去重
def w_get(self):
for data in Anchor.get_datas(self):
if 'http' in data[0]:
wget.download(data[0], out=self.path)
print(data[1] + "下载完成")
else:
wget.download('http:' + data[0], out=self.path)
print(data[1] + "下载完成")
def file(self):
# 检验给出的路径是否真地存
a = os.path.exists(self.path)
if a is False:
os.mkdir(self.path)
self.download()
if __name__ == '__main__':
hyURL = "https://www.huya.com/g/lol"
filePath = 'D:/虎牙主播排行'
anchor = Anchor(hyURL, filePath)
anchor.file()
# html = requests.get(hyURL).request.headers
# print(html)
页面结构:
- get_datas()是用来分析页面并提取数据。
- parsel 模块主要用来将请求后的字符串格式解析成re,xpath,css进行内容的匹配,具体用法不在此讲解。
- download()和w_get()都是下载文件,还有withopen也可以打开文件并保存,但是urllib.request.urlretrieve(data,path)方法下载速度相比两者都快,且可以自动进行 去重 的操作,下载的文件夹中没有该文件就下载,否则就跳过,有点 set 集合的意思。
人脸识别代码:
import requests, base64, os
class Face_Recognition:
def __init__(self, path):
self.path = path + '/'
# 获取接口的token
def get_token(self):
url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=“你自己的AK”&client_secret=“你自己的SK”'
response = requests.get(url)
if response:
return response.json()['access_token']
# 人脸识别
def face_rg(self, filename=''):
with open(self.path + filename, 'rb')as file:
data = base64.b64encode(file.read())
image = data.decode()
imageType = "BASE64"
url = "https://aip.baidubce.com/rest/2.0/face/v3/detect"
headers = {
'content-type': 'application/json'}
params = {
"image": image, "image_type": imageType,
"face_field": "faceshape,facetype,beauty"} # beauty:美丑打分,范围0-100,越大表示越美。当face_fields包含beauty时返回
accessToken = self.get_token()
requestURL = url + "?access_token=" + accessToken
response = requests.post(requestURL, data=params, headers=headers)
# 会有识别不出来人脸的可能
try:
return response.json()['result']['face_list'][0]['beauty']
except Exception:
return False
# # 获取所有图片名称
# def get_imgPath(self):
# a = []
# for i, j, k in os.walk(self.path): # os.walk用来遍历一个目录内各个子目录和子文件。
# a = k
# return a
# 批量检测美丑
def batch_testing(self):
imgList = os.listdir(self.path) # 返回指定目录下的所有文件和目录名
fs = []
for i in imgList:
beauty = self.face_rg(i)
if beauty is not False:
a = {
'姓名': i.replace('.jpg', ''), '颜值': str(beauty)} # beauty必须转换成str类型,不然排序会报类型错误
fs.append(a)
return fs
# 按颜值降序排序
def yz_sort(self):
fs = self.batch_testing()
sortList = sorted(fs, key=lambda x: x['颜值'], reverse=True)
return sortList
if __name__ == '__main__':
imgPath = 'D:/虎牙主播排行'
face = Face_Recognition(imgPath).yz_sort()
print(face)
- get_token()是获取百度接口的token
- face_rg(file_path)是调用百度人脸识别接口
- get_imgPath(path)是获取所有已保存图片的文件名
- batch_testing(path):是循环调用face_rg(file_path)来检测所有图片
- qwe()是给已生成分数的数据排序,lambda 是匿名函数,有兴趣可以了解一下
获取人脸识别接口教程:
1.打开百度智能云登录界面扫码登录
2.点击产品服务,选择人脸识别
3.点击创建应用并填写信息
4.获取我们需要的信息
5.点击管理,查看文档,选择人脸检测
文档详细的告诉你需要怎么做能使用接口