Python入门到实战:get请求和响应

53 阅读6分钟

一、获取某讯岗位标题数据

1.单页数据获取

首先,我们的目标是从腾讯招聘网站获取岗位标题信息。以下是获取单页岗位标题的代码:

import requests
# 获取单页数据
# 控制输入页码数,给到变量page 默认字符串
page = input("请输入你想要查询的页面:")
# 用f插值法 将变量page放在pageIndex中,将输入的内容通过f插值法给到参数pageIndex
url = f'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1763539137582&countryId=&cityId=&bgIds=&productId=&categoryId=40001001,40001002,40001003,40001004,40001005,40001006&parentCategoryId=&attrId=1&keyword=&pageIndex={page}&pageSize=10&language=zh-cn&area=cn'
# 养成好习惯 带上请求头
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36'
}
# 因为是网页页面是get请求方式,所以用get请求方式
res = requests.get(url, headers=headers)
# 因为返回的响应结果像是字典类型的字符串数据 所以用json方法
res_data = res.json()
count = 1
# 利用for循环,遍历res_data中字典Data中的Posts列表的每一个列表元素给到变量i
for i in res_data['Data']['Posts']:
    # 推荐用内置方法get 获取目标数据的值,如果存在能获取,不存在就返回空值
    RecruitPostName = i.get('RecruitPostName', '')  # 岗位名字
    LocationName = i.get('LocationName', '')  # 岗位地址
    RequireWorkYearsName = i.get('RequireWorkYearsName', '')  # 工作经历年限
    Responsibility = i.get('Responsibility', '')  # 岗位职责
    print(count,RecruitPostName, LocationName, RequireWorkYearsName, Responsibility,sep='|') # sep属性是print内置参数 用于控制多个输出参数之间的分隔符。
    count += 1

res_data响应数据 image.png 在这段代码中,我们通过用户输入的页码构建请求URL,然后使用requests库发送请求。利用res.json()方法将响应数据转换为字典类型,最后通过循环遍历Posts列表,获取每个岗位的标题。

2.多页数据获取

如果要获取多页数据,我们可以使用循环来实现。以下是获取10页岗位标题的代码:

import time

import requests
# 获取多页数据 10页数据
for page in range(1,11): #利用for循环遍历从 1 到 10 的整数序列,每次循环将当前值赋给变量 page。
    # 用f插值法 将变量page放在pageIndex中,将输入的内容通过f插值法给到参数pageIndex
    url = f'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1763539137582&countryId=&cityId=&bgIds=&productId=&categoryId=40001001,40001002,40001003,40001004,40001005,40001006&parentCategoryId=&attrId=1&keyword=&pageIndex={page}&pageSize=10&language=zh-cn&area=cn'
    # 养成好习惯 带上请求头
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36'
    }
    # 因为是网页页面是get请求方式,所以用get请求方式
    res = requests.get(url, headers=headers)
    # 因为返回的响应结果像是字典类型的字符串数据 所以用json方法
    res_data = res.json()
    count = 1
    # 利用for循环,遍历res_data中字典Data中的Posts的每一个列表元素给到变量i
    for i in res_data['Data']['Posts']:
count += 1
print(f'这是获取的第{page}页数据')
'''
这里我们使用for循环生成1到10的页码,每次循环构建不同的URL并发送请求。
解析响应数据后,打印出岗位标题和序号。如果需要放慢请求速度,可以使用
time.sleep(2)让程序休眠
2秒。
'''
time.sleep(2)

这里我们使用for循环生成1到10的页码,每次循环构建不同的URL并发送请求。解析响应数据后,打印出岗位标题和序号。如果需要放慢请求速度,可以使用time.sleep(2)让程序休眠2秒。

3.获取未知页数据

当我们不知道数据有多少页时,可以使用无限循环,并设置结束条件。以下是获取腾讯岗位标题的完整代码:

import time
import requests
# 获取未知页数据
# 定义初始页面设置为1 从第一页开始进入循环
page = 1
while True: # 条件为真则一直循环
    # 用f插值法 将变量page放在pageIndex中,将输入的内容通过f插值法给到参数pageIndex
    url = f'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1763539137582&countryId=&cityId=&bgIds=&productId=&categoryId=40001001,40001002,40001003,40001004,40001005,40001006&parentCategoryId=&attrId=1&keyword=&pageIndex={page}&pageSize=10&language=zh-cn&area=cn'
    # 养成好习惯 带上请求头
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36'
    }
    # 因为是网页页面是get请求方式,所以用get请求方式
    res = requests.get(url, headers=headers)
    # 因为返回的响应结果像是字典类型的字符串数据 所以用json方法
    res_data = res.json()
    # 如果res_data['Data']['Posts']为空值,第86页获取不到数据,
    # 所以返回的结果是None则终止while循环
    if res_data['Data']['Posts'] is None:
        break
    count = 1
    # 利用for循环,遍历res_data中字典Data中的Posts的每一个列表元素给到变量i
    for i in res_data['Data']['Posts']:
        # 推荐用内置方法get 获取目标数据的值,如果存在能获取,不存在就返回空值
        RecruitPostName = i.get('RecruitPostName', '')  # 岗位名字
        LocationName = i.get('LocationName', '')  # 岗位地址
        RequireWorkYearsName = i.get('RequireWorkYearsName', '')  # 工作经历年限
        Responsibility = i.get('Responsibility', '')  # 岗位职责
        print(count, RecruitPostName, LocationName, RequireWorkYearsName, Responsibility,sep='|')  # sep属性是print内置参数 用于控制多个输出参数之间的分隔符。
        count += 1

    print(f"这是获取的第{page}页数据")
    page += 1
    time.sleep(1)

获取某瓣冒险电影数据

1.目标请求与数据解析

我们要从豆瓣电影网站获取剧情类型电影的信息。以下是获取指定页电影信息的代码:

import requests
url = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20'
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36'
}
res = requests.get(url,headers=headers)
res_data = res.json()
count = 1
for i in res_data:
    title = i.get('title','') # 电影名
    actors_li = i.get('actors','') # 制作人
    # 因为得到的是列表类型数据,列表里面是字串数据,用join拼接法将列表里面数据拼接起来
    actors = (',').join(actors_li)
    release_date = i.get('release_date','') # 播出时间
    score = i.get('score','') # 得分
    print(count,title,actors,release_date,score,sep='|')
    count += 1

在这段代码中,我们首先定义了请求的URL和请求头,使用user-agent来伪装成浏览器请求。发送请求后,将响应数据转换为列表类型,然后循环遍历列表,打印出电影的标题、评分和演员信息。

2.获取未知页数据

由于不知道豆瓣冒险电影有多少页,我们可以使用无限循环来获取全部数据。以下是完整代码:

import requests
# 观察滑动页面url的变化
# start 每滑动一面 start增加20 
page = 0
pages = 1
while True: # 条件为真无限循环
    url = f'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start={page}&limit=20'
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36'
    }
    res = requests.get(url, headers=headers)
    res_data = res.json()
    # 当res_data为空列表时,就终止循环
    if res_data == []:
        break
    count = 1
    for i in res_data:
        title = i.get('title', '')  # 电影名
        actors_li = i.get('actors', '')  # 制作人
        # 因为得到的是列表类型数据,列表里面是字串数据,用join拼接法将列表里面数据拼接起来
        actors = (',').join(actors_li)
        release_date = i.get('release_date', '')  # 播出时间
        score = i.get('score', '')  # 得分
        print(count, title, actors, release_date, score, sep='|')
        count += 1
    print(f'这是获取的第{pages}页数据')
    page += 20
    pages += 1

这里我们使用whileTrue实现无限循环,每次循环根据start参数构建不同的URL并发送请求。当响应数据为空列表时,说明没有更多电影数据了,使用break语句跳出循环。同时,每次循环结束后,将start参数增加20,以获取下一页的数据。