第一次接触爬虫

最近对爬虫感兴趣,写了个小小的爬虫程序

爬取信息代码:

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.点击管理,查看文档,选择人脸检测

文档详细的告诉你需要怎么做能使用接口
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36562656/article/details/108769889