1. json数据与python数据转换

        json是一种轻量级数据交换格式,适合用于数据交互,本质是具有特定格式的字符串,但采用完全独立与编程语言的文本格式来存储和表示数据。

json键值对用来保存Javascript对象的一种方式,键值对组合中的键名写在最前面,并用双引号包裹,使用冒号分隔,然后紧接着值。例如:

{
"website":[
{"name":"哔哩哔哩","url":"www.bilibili.com"},
{"name":"百度","url":"www.baidu.com"}
]
}

python中用来解码和编码json数据主要为两个函数json.dumps()和json.loads()

improt json
data = {
    'name':'myname',
    'age':100
}
json_str = json.dumps(data)    #将python数据结构转换为json

data = json.loads(json_str)    #将json数据结构转换为python

2. 网站解析

豆瓣电影:https://movie.douban.com/j/chart

腾讯音乐招聘:https://join.tencentmusic.com/social?job_class=T

接下来对上面两个网址进行解析,爬取需要的数据,使用的是谷歌浏览器,先对豆瓣网页进行解析:

最后我们就可以得到以下信息

解析另一个网站也是同样的方法,但我们可以看到有很多list的XHR数据,后面会讲解怎么快速获取这些数据

3.爬取网页数据

在我们解析完这些网页之后,我们通过requests库来请求这些数据,在headers中找到这些,取?之前的作为url,注意是GET请求,然后找到User-Agent,设置params值

我们就可以对网站发出请求了,获取到json数据

import requests
import pandas as pd
url = "https://movie.douban.com/j/chart/top_list"
header = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
}
param = {
        "type": '13', 
        "interval_id": '100:90',
        "action": '',
        "start": '0',
        "limit": '20'  
    }
res = requests.get(url=url, headers=header, params=param)
print(res.json())

但我们是需要获取到多页数据,以上代码只能帮我们获取到这个网页初始呈现的数据,因此我们需要分析params的参数值

那么要爬取较多的数据和不同类型的数据,就更改参数即可

import requests
import pandas as pd
url = "https://movie.douban.com/j/chart/top_list"
header = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
}

type_list = [11,5,13]

head = ['电影名','演员','排名','时间','地区']
for n in type_list:
    info_list = []
    param = {
        "type": f'{n}',  # 电影类型
        "interval_id": '100:90',
        "action": '',
        "start": '0',
        "limit": '100'  # 电影页数,网页默认显示每20条数据为1页
    }
    res = requests.get(url=url, headers=header, params=param)
    for i in range(int(param['limit'])):
        info = res.json()[i]
        info_list.append([info["title"],info["actors"],info["rank"],info["release_date"],info["regions"]])
    df = pd.DataFrame(info_list,columns=head)
    # df.to_csv(f"{param['type']}类型电影.csv")
    print(df)

以下是获取数据结果

 

另一种情况是网页不是下拉更新数据的,而是设置了分页功能来更新数据

类别的设置也和data参数有关

我们可以写出爬取数据代码,需要主义的是,因为不能保证每页的数据量都是10条,所以在遍历时会报错,解决方法也很简单,只需要加个异常处理就行了,来让程序执行完整

import requests
import pandas as pd
url = "https://join.tencentmusic.com/api/job/list"
header = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
}
page = 6
head = ['id','职位','类别','工作地点','需求人数']
row_list = []
for n in range(1,page+1):
    data = {
            "page": n,
            "ss": 10,
            "job_class": [
                "P"             #增加类别
            ],
            "work_city": "",
            "setid": "",
            "deptids": "",
            "order_by": "is_recommend"
    }
    res = requests.post(url=url,headers=header,data=data)
    for i in range(data['ss']):
        try:
            info = res.json()['data']['items'][i]
            row = [info['id'],info['name'],info['jobf_descr'],info['work_city'],info['need_num']]
            row_list.append(row)
        except:
            break
df = pd.DataFrame(row_list,columns=head)
# df.to_csv("招聘信息(产品类).csv")
print(df)

以下是获取数据结果


 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐