Kaggle网站数据集抓取

抓取kaggle网站代码

github:  https://github.com/Gscsd8527/AllProject/blob/master/Kaggle/new_kaggle.py

import requests
import re
import json
import uuid
import datetime

BASE_URL = 'https://www.kaggle.com'

HEADERS = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
Session = requests.session()
# 最多给显示1万的数据,所以写个10020
DATASETS = 10020

def getToken():
    headers = HEADERS.copy()
    headers['upgrade-insecure-requests'] = '1'
    url = 'https://www.kaggle.com/datasets'
    response = Session.get(url, headers=headers)
    token = ''
    if response.status_code == 200:
        text = response.text
        token = re.findall("antiForgeryToken: '(.*?)',", text)[0]
    else:
        print('错误响应码为: ', response.status_code)
    return token

# 获取每一页请求的data数据
def getEveryPageData(token):
    # data_list = []
    pages = DATASETS // 20
    ys = DATASETS % 20
    if ys > 1:
        pages += 1
    for num in range(1, pages+1):
    # for num in range(1, DATASETS+1):
        print('总共有 {}  页,这是第  {}  条数据'.format(pages, num))
        data = {
            "page": num,
            "group": "public",
            "size": "all",
            "fileType": "all",
            "license": "all",
            "viewed": "all",
            "categoryIds": [],
            "search": "",
            # "sortBy": "hottest",
            # "sortBy": "votes",
            # "sortBy": "published",
            # "sortBy": "updated",
            "sortBy": "usability",
            "userId": None,
            "organizationId": None,
            "maintainerOrganizationId": None,
            "minSize": None,
            "maxSize": None,
            "isUserQuery": 'false'
        }
        requestEveryPageData(token, data)
    #     data_list.append(data)
    # return data_list

# 将数组大小对齐
def myadd(lst1, lst2):
    if len(lst2) < len(lst1):
        my_len = len(lst1) - len(lst2)
        for i in range(my_len):
            lst2.append(' ')
    return lst2

# 解析文件带后缀
def parse1(dt, filenames, filesizes, about_this_files, Columns):
    try:
        filename = re.findall('"relativePath":"(.*?)",', dt)
        # 提取文件名和文件大小
        for na in filename:
            try:
                name = na.split('/')[-1]
                filenames.append(name)
                size = re.findall('%s.*?"rowCount":(\d+)' % name, dt)
                if len(size):
                    filesizes.append(size[0])
                else:
                    filesizes.append(' ')
            except:
                pass
        # 提取关于文件的介绍
        for name in filenames:
            try:
                about_this_file = re.findall('"name":"%s","description":"(.*?)"}' % name, dt)
                if len(about_this_file):
                    about_file = about_this_file[0].replace('\n', '').replace('\\', '').replace('u0022', '').replace('u0026gt;', '').replace('u0026lt;', '').replace('u0027', '')
                    about_this_files.append(about_file)
                else:
                    about_this_files.append(' ')
            except:
                pass
        # 提取columns,这个columns在文件名上方
        for name in filenames:
            filename_len = len(filenames)
            index = filenames.index(name)
            # 判断是否不是最后一个文件
            column = ''
            if index < (filename_len-1):
                # 从出现这个文件开始到下个文件开始结束,遇到带后缀的就还能匹配
                try:
                    col_compile = re.compile('%s.*?"columns":.*?%s' % (name, name))
                    data1 = re.findall(col_compile, dt)[0]
                    column = re.findall('"name":"(.*?)","description":("\w+.*?"|null)', data1)
                except:
                    pass
            elif filenames[-1] == name:
                try:
                    col_compile = re.compile('%s.*?"columns":.*?%s' % (name, name))
                    data1 = re.findall(col_compile, dt)[0]
                    column = re.findall('"name":"(.*?)","description":("\w+.*?"|null)', data1)
                except:
                    pass
            columns = []
            dct = {}
            if len(column):
                # temp = []
                for i in column:
                    k, v = i[0].strip(' '), i[1].strip(' ').strip(r'\"')
                    dct[k] = v
                for k, v in dct.items():
                    if len(k):
                        if len(k) > 300:
                            k = ''
                        if len(v) > 500:
                            v = ''
                        # temp.append(k)
                        if k not in filenames:
                            columns.append([k, v])
                Columns.append(columns)
            else:
                Columns.append(['',''])
            del dct
    except:
        pass
    return filenames, filesizes, about_this_files, Columns

# 解析文件不带后缀
def parse2(dt, filenames, filesizes, about_this_files, Columns):
    try:
        data = re.findall('],"name":"(.*?)","description":"(.*?)"', dt)
        filenames = []
        filesizes = []
        about_this_files = []
        Columns = []
        # 得到文件名和文件描述
        for i in data:
            filter_str = 'Context'
            if filter_str not in i[1]:
                k = i[0].strip(' ')
                if len(k) > 300:
                    k = ' '
                v = i[1].strip(' ')
                if len(v) > 500:
                    v = ' '
                filenames.append(k)
                about_this_files.append(v)
        # 得到文件大小
        for name in filenames:
            size = re.findall('%s.*?"rowCount":(\d+)' % name, dt)
            if len(size):
                filesizes.append(size[0])
            else:
                filesizes.append(' ')
        # 得到column
        for name in filenames:
            index = filenames.index(name)
            if index == 0:
                col_compile = re.compile('"columns":.*?%s' % name)
                data1 = re.findall(col_compile, dt)[0]
                column = re.findall('"name":"(.*?)","description":("\w+.*?"|null|"")', data1)
            else:
                col_compile = re.compile('%s.*?"columns":.*?%s' % (filenames[index - 1], name))
                data1 = re.findall(col_compile, dt)[0]
                column = re.findall('"name":"(.*?)","description":("\w+.*?"|null|".*?")', data1)
            columns = []
            dct = {}
            if len(column):
                # temp = []
                for i in column:
                    k, v = i[0].strip(' '), i[1].strip(' ').strip(r'\"')
                    dct[k] = v
                for k, v in dct.items():
                    if len(k):
                        if len(k) > 300:
                            k = ''
                        if len(v) > 500:
                            v = ''
                        # temp.append(k)
                        if k not in filenames:
                            columns.append([k, v])
                Columns.append(columns)
            else:
                Columns.append(['', ''])
            del dct
            # if len(column):
            #     for i in column:
            #         k = i[0].strip(' ')
            #         if len(k) > 300:
            #             k = ' '
            #         v = i[1].strip(' ')
            #         if len(v) > 500:
            #             v = ' '
            #         if k not in filenames:
            #             columns.append([k, v])
            #     Columns.append(columns)
            # else:
            #     Columns.append([['', ''],])
    except:
        pass
    return filenames, filesizes, about_this_files, Columns


def parseData(dt):
    # 提取文件名
    filename = re.findall('"relativePath":"(.*?)",', dt)
    # 根据filename的值来判断两套解析规则
    # 文件名列表
    filenames = []
    # 文件大小列表
    filesizes = []
    # 关于文件解释列表
    about_this_files = []
    # 每个文件对应的columns列表
    Columns = []
    if filename:
        filenames, filesizes, about_this_files, Columns = parse1(dt, filenames, filesizes, about_this_files, Columns)
    else:
        filenames, filesizes, about_this_files, Columns = parse2(dt, filenames, filesizes, about_this_files, Columns)
    filesizes = myadd(filenames, filesizes)
    about_this_files = myadd(filenames, about_this_files)
    Columns = myadd(filenames, Columns)
    a = zip(filenames, filesizes, about_this_files, Columns)
    file_data = {}
    index = 1
    for i in a:
        file_name = i[0]
        file_size = i[1]
        file_about = i[2]
        file_column = i[3]
        file_type = ''
        if '.' in file_name:
            file_type = file_name.rsplit('.', 1)[-1]
        temp_dict = {
            index: {
                'fileName': file_name,
                'fileSize': file_size,
                'fileType': file_type,
                'aboutThisFile': file_about,
                'columns': file_column
            }
        }
        file_data.update(temp_dict)
        index += 1
    return file_data



def parseUrl(url):
    headers = HEADERS.copy()
    temp_headers = {
        'accept': 'text/html, application/xhtml+xml',
        'Referer': 'https://www.kaggle.com/datasets',
        'Turbolinks-Referrer': 'https://www.kaggle.com/datasets'
    }
    headers.update(temp_headers)
    response = requests.get(url, headers=headers)
    text = response.text
    # re_compile = re.compile(r'<script type="application/ld\+json">(.*?)</script>')
    re_compile = re.compile(r'<script.*?type="application/ld\+json">(.*?)</script>')
    description_str = re.findall(re_compile, text)[0]
    # re_compile = re.compile(r'<div data-component-name="DatasetContainer".*?<script>(.*?)</script>')
    re_compile = re.compile(r'<div data-component-name="DatasetContainer".*?<script.*?>(.*?)</script>')
    data = re.findall(re_compile, text)[0]
    dt_compile = re.compile('push\((.*)}')
    dt = re.findall(dt_compile, data)[0]
    return description_str, dt



# 请求每一页的数据
def requestEveryPageData(token, data):
    url = 'https://www.kaggle.com/requests/SearchDatasetsRequest'
    headers = HEADERS.copy()
    temp_headers = {
        '__requestverificationtoken': token,
        'accept': 'application/json',
        'content-type': 'application/json',
        'Referer': 'https://www.kaggle.com/datasets',
        'x-xsrf-token': token
    }
    headers.update(temp_headers)
    # for data in data_list:
    response = Session.post(url, data=json.dumps(data), headers=headers)
    if response.status_code == 200:
        text = response.text
        data_json = json.loads(text)
        items = data_json['result']['items']
        for item in items:
            try:
                # 1. 数据集标识
                uid = uuid.uuid1()
                suid = str(uid).replace('-', '')
                datasetId = suid
                doi = ''
                handle = ''
                title = item['title']
                print('name= ', title)
                datasetOwner = item['ownerName']
                datasetOwnerIconPath = item['ownerAvatarUrl']
                overview = item['overview']
                downloadUrl = ''
                try:
                    downloadUrl = BASE_URL + item['downloadUrl']
                except:
                    print('downloadUrl error')
                source = BASE_URL + item['datasetUrl']
                lastUpdated = item['dateUpdated']
                dateCreated = item['dateCreated']
                license = item['licenseName']
                visibility = 'Public'
                datasetSize = ''
                try:
                    datasetSize = item['datasetSize']
                except:
                    print('datasetSize error')
                currentVersion = item['currentDatasetVersionNumber']
                expectedUpdateFrequency = ''
                try:
                    expectedUpdateFrequency_score = item['usabilityRating']['updateFrequencyScore']
                    if expectedUpdateFrequency_score == 0:
                        expectedUpdateFrequency = '0: Not specified'
                except Exception as e:
                    print('expectedUpdateFrequency error', e)
                tags = []
                categories = item['categories']['categories']
                for categorie in categories:
                    tags.append(categorie['name'])
                collaborators = ''
                collaboratorIconPath = ''
                # 相似数据集
                similarDatasets = ''
                try:
                    similar_url = source + '/suggestions.json'
                    similar_headers = headers.copy()
                    similar_headers['Referer'] = source
                    response = requests.get(similar_url, similar_headers)
                    if response.status_code == 200:
                        json_data = json.loads(response.text)
                        similarDatasets_dict = {}
                        similar_index = 1
                        for every in json_data:
                            name = every['title']
                            start_url = 'https://www.kaggle.com'
                            name_url = start_url + every['entityUrl']
                            thumbnailImageUrl = every['thumbnailImageUrl']
                            temp_dict = {
                                similar_index: {
                                    'name': name,
                                    'nameUrl': name_url,
                                    'nameImgUrl': thumbnailImageUrl
                                }
                            }
                            similarDatasets_dict.update(temp_dict)
                            similar_index += 1
                        similarDatasets = similarDatasets_dict.copy()
                except:
                    pass
                description = ''
                description_json = ''
                ColumsData_str = ''
                try:
                    description_str, ColumsData_str = parseUrl(source)
                    description_json = json.loads(description_str)
                    description = description_json['description']
                    # data = parseData(ColumsData_str)
                except Exception as e:
                    print('description error', e)

                spiderDateTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                # print('url=  ', source)
                Data = {
                    'datasetId': datasetId,
                    'doi': doi,
                    'handle': handle,
                    'name': title,
                    'overview': overview,
                    'tags': tags,
                    'size': datasetSize,
                    'description': description,
                    'description_source': description_json,
                    'data': '',
                    'data_source': ColumsData_str,
                    'similarDatasets': similarDatasets,
                    'license': license,
                    'visibility': visibility,
                    'provenance_source': '',
                    'datasetOwner': datasetOwner,
                    'datasetOwnerIconPath': datasetOwnerIconPath,
                    'collaborators': collaborators,
                    'collaboratorIconPath': collaboratorIconPath,
                    'expectedUpdateFrequency': expectedUpdateFrequency,
                    'lastUpdated': lastUpdated,
                    'dateCreated': dateCreated,
                    'currentVersion': currentVersion,
                    'path': '/data/www/html/dataset/Kaggle',
                    'source': source,
                    'file_url': downloadUrl,
                    'data_json': item,
                    'spiderDateTime': spiderDateTime,
                }
                Data_json = json.dumps(Data)
                with open('KaggleData4.json', 'a+', encoding='utf-8') as f:
                    f.write(Data_json)
                    f.write('\n')
            except Exception as e:
                print('cuowu= ', e)
                with open('error.json', 'a+', encoding='utf-8') as f:
                    f.write(BASE_URL + item['downloadUrl'])
                    f.write('\n')
    else:
        print('错误响应码为---: ', response.status_code)

def main():
    token = getToken()
    # data_list = getEveryPageData()
    # requestEveryPageData(token, data_list)
    getEveryPageData(token)

if __name__ == '__main__':
    main()

 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kaggle电影数据集是一个实用的资源,旨在提供关于电影的详细信息和统计数据,供数据科学家、研究人员和电影爱好者使用。 这个数据集包含了许多关于电影的不同属性,比如电影的标题、导演、演员、类型、评分、票房等等。这些属性可以用来进行各种有趣的分析和研究。通过对这些数据进行分析,可以了解电影产业的趋势、观众的偏好和市场变化等信息。此外,这个数据集还有一些额外的特征,比如收入和成本等,可以用来进行财务分析或预测电影的商业成功。 在Kaggle电影数据集中,可以进行多种分析和可视化操作,例如: 1. 评估不同类型电影的受欢迎程度和收益情况,了解哪种类型的电影更受欢迎,哪种类型的电影更具商业价值。 2. 研究导演和演员之间的关系,通过分析他们的作品和评分情况,探讨不同导演和演员的成功程度。 3. 预测电影的票房表现,通过构建模型,利用属性数据来预测电影的商业成功度。 4. 比较不同国家和地区电影产业的发展情况,探讨哪个地区的电影市场更具潜力。 总的来说,Kaggle电影数据集是一个丰富和有趣的数据资源,可以用于各种研究和分析目的。通过对这个数据集的利用,可以深入了解电影产业、市场趋势和观众的偏好等信息,并为未来的电影制作和推广活动提供有价值的参考。 ### 回答2: Kaggle电影数据集是一个包含了大量有关电影的数据的在线平台。这个数据集是由来自世界各地的数据科学家和机器学习专家贡献的。它包含了各种各样的电影数据,如电影的评分、评论、票房收入、导演、演员等信息。 通过使用这个数据集,我们可以进行各种有趣的分析和预测。我们可以研究不同类型电影的受欢迎程度,并尝试预测一部电影的票房收入。我们还可以利用这个数据集来了解电影产业的发展趋势,例如随着时间的推移,电影的收入是否增加,不同类型电影的数量是否有变化等。 此外,Kaggle电影数据集还可以帮助我们更好地了解电影评论与评分之间的关系。我们可以通过分析这些数据,发现一些影响电影评分的因素,例如电影的类型、导演的知名度、演员的表演水平等。这些洞察可以帮助电影制片人和发行商更好地理解他们的受众,并在电影制作过程中做出更明智的决策。 总的来说,Kaggle电影数据集是一个丰富多样的资源,可以让我们更深入地了解电影产业。它为数据科学家和机器学习专家提供了一个研究和预测电影相关问题的平台,也促进了电影制片人和发行商在电影制作和营销方面做出更明智的决策。 ### 回答3: Kaggle电影数据集是一个在Kaggle平台上可用的开放数据集,其中包含了许多关于电影的数据。这个数据集是由Kaggle社区中的用户共享和整理的。 这个数据集包含了大量有关电影的信息,包括电影的标题、上映时间、导演、演员阵容、电影类型、制片国家和票房收入等。这些数据可以用于进行电影行业的研究和分析。 利用这个数据集,研究人员可以探索电影的受欢迎程度和票房表现之间的关系,研究不同类型电影的市场需求和观众口味。同时,可以利用这个数据集来比较不同导演和演员的表现,了解他们对电影的影响力。还可以通过这个数据集来分析不同制片国家电影产业的发展状况和票房表现。 对于电影制片方和市场营销团队来说,这个数据集也具有非常大的价值。他们可以利用这些数据来预测电影的票房表现,评估投资回报率,并制定相应的市场推广策略。此外,通过分析这个数据集,他们还可以了解观众对不同类型电影的喜好,以便更好地满足市场需求。 总之,Kaggle电影数据集是一个非常有价值的资源,可以用于电影行业的研究和分析,以及电影制片方和市场营销团队的决策支持。它提供了关于电影的丰富信息,可以帮助我们更好地了解电影市场的运作和观众的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值