python爬虫小案例

案例一:爬取豆瓣网评分最高的250部电影

# python爬虫爬取豆瓣网评分最高的250部电影
# 操作思路
#   1.打开要抓取的网页
#   2.查看接口(网页地址url)的调用顺序
#   3.查看数据结构

import requests
import bs4

start = 0
result = []
# 用户代理,必须用浏览器的,不然没法爬取
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/99.0.4844.84 Safari/537.36 "
}

# 爬取10页的信息
for i in range(0, 10):
    # 得到浏览器的接口信息
    res = requests.get("https://movie.douban.com/top250?start=" + str(start) + "&filter=", headers=header)
    # 改变编码的字符集
    res.encoding = "utf-8"
    start += 25
    # 将requests抓道的文本给soup,html.parser 固定的解析模式
    soup = bs4.BeautifulSoup(res.text, "html.parser")
    # 第一种写 class 的方法 直接写
    # 找到所有的元素并且进行遍历
    for each in soup.find_all("div", "info"):
        # 取得电影的名字,根据路径填写相关元素即可 (string 与 text 都可以)
        title = each.div.a.span.string
        # 获取电影上映的年限 , p.contents[2] ==> p里面的第二行
        # 第二种写 class 的方法 class_="bd"
        yearline = each.find("div", class_="bd").p.contents[2].string
        # 用replace去除掉 换行符 和 空格
        yearline = yearline.replace("\n", "")
        yearline = yearline.replace(" ", "")
        # 获得前四个字符
        year = yearline[0:4]
        # 获取豆瓣的评分
        # 第三种写 class 的方法 {"class": "rating_num"}
        rating = each.find("span", {"class": "rating_num"}).string
        # 把数据加到 result 中去, 规范数据的格式
        oneresult = [title, rating, year]
        result.append(oneresult)
print(result)

案例一(改进):爬取豆瓣网评分最高的250部电影,并放到Excel文件里

# python爬虫爬取豆瓣网评分最高的250部电影
# 操作思路
#   1.打开要抓取的网页
#   2.查看接口(网页地址url)的调用顺序
#   3.查看数据结构

import requests
import bs4
import openpyxl

start = 0
result = []
# 用户代理,必须用浏览器的,不然没法爬取
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/99.0.4844.84 Safari/537.36 "
}

# 爬取10页的信息
for i in range(0, 10):
    # 得到浏览器的接口信息
    res = requests.get("https://movie.douban.com/top250?start=" + str(start) + "&filter=", headers=header)
    # 改变编码的字符集
    res.encoding = "utf-8"
    start += 25
    # 将requests抓道的文本给soup,html.parser 固定的解析模式
    soup = bs4.BeautifulSoup(res.text, "html.parser")
    # 第一种写 class 的方法 直接写
    # 找到所有的元素并且进行遍历
    for each in soup.find_all("div", "info"):
        # 取得电影的名字,根据路径填写相关元素即可 (string 与 text 都可以)
        title = each.div.a.span.string
        # 获取电影上映的年限 , p.contents[2] ==> p里面的第二行
        # 第二种写 class 的方法 class_="bd"
        yearline = each.find("div", class_="bd").p.contents[2].string
        # 用replace去除掉 换行符 和 空格
        yearline = yearline.replace("\n", "")
        yearline = yearline.replace(" ", "")
        # 获得前四个字符
        year = yearline[0:4]
        # 获取豆瓣的评分
        # 第三种写 class 的方法 {"class": "rating_num"}
        rating = each.find("span", {"class": "rating_num"}).string
        # 把数据加到 result 中去, 规范数据的格式
        oneresult = [title, rating, year]
        result.append(oneresult)


# 将数据保存到Excel文件里
def to_excel(result):
    wb = openpyxl.Workbook()
    # 判断要保存的是数据还是文本
    wb.guess_type = True
    ws = wb.active
    ws.append(["电影名", "评分", "出版年份"])
    for each in result:
        ws.append(each)
    wb.save("豆瓣TOP250.xlsx")


def main():
    to_excel(result)


if __name__ == "__main__":
    main()

# print(result)

案例二:爬取2017年城市的平均房价,并生成Excel ==》主要是函数的封装

正则表达式的使用
# 请求下载HTML文档
import requests
# 解析下载的HTML文档 BeautifulSoup4
import bs4
# 使用正则表达式,筛选数据的格式
import re
# 保存成excel
import openpyxl


def open_url(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/99.0.4844.84 Safari/537.36 "
    }
    res = requests.get(url, headers=headers)
    return res


def find_data(res):
    # 列表data用来保存数据
    data = []
    soup = bs4.BeautifulSoup(res.text, "html.parser")
    content = soup.find(id="Cnt-Main-Article-QQ")
    # 查找所有关键字所匹配的内容,返回值会放到一个列表里面
    target = content.find_all("p", style="TEXT-INDENT: 2em")
    # 将target变成一个迭代器,才可以使用next()函数
    target = iter(target)
    for each in target:
        # print(each.text)
        # 判断这一行是不是纯数字的形式 isnumeric()
        if each.text.isnumeric():
            # 将纯数字下面的四个数据作为一个列表加进data里面
            data.append([
                # 正则表达式得到[]之间的字符串,并且分组
                re.search(r"\[(.+)\]", next(target).text).group(1),
                # 正则表达式 数字后面的都要,不分组
                re.search(r"\d.*", next(target).text).group(),
                re.search(r"\d.*", next(target).text).group(),
                re.search(r"\d.*", next(target).text).group()
            ])
    return data


def to_excel(data):
    wb = openpyxl.Workbook()
    # guess_types 自动判断达到的文本是什么类型的
    wb.guess_types = True
    # 获取一个工作表
    ws = wb.active
    # 把标题加进去
    ws.append(["城市", "平均房价", "平均工资", "房价工资比"])
    for each in data:
        ws.append(each)

    wb.save("2017年中国主要城市房价工资比排行榜.xlsx")


def main():
    url = "https://news.house.qq.com/a/20170702/003985.htm"
    res = open_url(url)
    data = find_data(res)
    to_excel(data)
    # 将得到的数据保存成文件的形式,存到本地查看,分析数据的结构
    # 也可以直接在网页上分析数据的结构
    # with open("test.txt", "w", encoding="utf-8") as file:
    #     # 把res里面的 text 写道文件里面,文件名是text.txt
    #     file.write(res.text)


# 调用运行
if __name__ == "__main__":
    main()

案例三:爬取网易云音乐的某首歌的热评

1. 从服务器获取数据需要用到 Form Data 的参数数据
2. 得到的数据是json的形式要用json来解析
import requests
import json


def get_hot_comments(res):
    file_name = input("请输入文件名:")
    # 解析json数据
    comments_json = json.loads(res.text)

    hot_comments = comments_json["hotComments"]
    with open("{}热评.txt".format(file_name), "w", encoding="utf-8") as file:
        for each in hot_comments:
            file.write(each["user"]["nickname"] + ":\n\n")
            file.write(each["content"] + ":\n")
            file.write("---------------------------------\n")


def get_comments(url):
    name_id = url.split("=")[1]
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/99.0.4844.84 Safari/537.36",
        # 指定这个请求是从哪儿来的
        "referer": "https://music.163.com/song?id=4466775"
    }
    # 数据在服务器中,使用post方式传递的,所以要传入网页中 Form Data的参数
    params = "snLPgVRqxAY1s1oq0iWZkjs0Sd7r5vVJ1vekAKqEVMk3R8kovMyjr3s/wjSTiIFl8qWtDjd5aDVYhgmoV9v+IINcoj" \
             "+qWJDgxCj6HixHkFhgjvrfHkNHXK2OjKa41pqKmdfLFwBNwQKdB8u0xV5EGyYy1Pb6xgB6l+M1ZVFmcdf0fnvm/iNxmWwYS" \
             "+hbZwT4tfzcPI3wQrnoiKmrBaSzS40Qq9aD2PPePssPr9qK+pqPNu3WCrEJeg2qzJje6V6AuzDqKjCJKrkT2O0GOZkwFQ== "

    encSecKey = "2f0f8a650977ec77083d50e09834dc0eda42d95311fb2623338f154e7e77db9ccc4250034777db85470cd3e682d2851f96f95b1441590857dddafbbb0d7f5ee3659c5ecebd0c9a0824ca19cb38376c958614d17c5ddd4f0bd4bdc973032d2e90c96015889691a5210c03d55ee573f47ffd01527ccc1f6523a95d41ea4191338b "

    data = {
        "params": params,
        "encSecKey": encSecKey
    }
    # target_url = "https://music.163.com/weapi/comment/resource/comments/get?csrf_token="
    target_url = "https://music.163.com/api/v1/resource/comments/R_SO_4_{}?csrf_token=".format(name_id)
    res = requests.post(target_url, headers=headers, data=data)

    return res


def main():
    url = input("请输入链接地址:")
    res = get_comments(url)
    get_hot_comments(res)

    # with open("comments.txt", "w", encoding="utf-8") as file:
    #     # 把res里面的 text 写道文件里面,文件名是text.txt
    #     file.write(res.text)


if __name__ == "__main__":
    main()

案例四:爬取百度图片
import requests
import os

# 创建一个文件夹放在里面
file_name = "图片\\"
if not os.path.exists(file_name):
    os.mkdir(file_name)


def get_url(url, headers):
    res = requests.get(url, headers=headers)
    return res


def get_pic(res, headers):
    pic = res.json()["data"]
    for i in range(29):
        pic_url = pic[i]["hoverURL"]
        pic_res = requests.get(pic_url, headers=headers)
        # wb 以二进制的形式写入(图片与音频都是一样的)
        with open("{}\\".format(file_name)+str(i)+".jpeg", "wb") as file:
            file.write(pic_res.content)


def main():
    url = "{}".format(input("请输入下载的地址(需要网页Header里面的URL):"))

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/99.0.4844.84 Safari/537.36 "
    }
    res = get_url(url, headers)
    get_pic(res, headers)
    print("下载完毕。")


if __name__ == "__main__":
    main()

案例五:爬取网易云音乐
import requests
import re
# 文件操作模块
import os

file_name = "eMusic\\"
# 如果没有文件夹就创建一个
if not os.path.exists(file_name):
    os.mkdir(file_name)
# 热歌榜链接,可以更换
url = "https://music.163.com/discover/toplist?id=3778678"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/99.0.4844.84 Safari/537.36 "
}

res = requests.get(url=url, headers=headers)

# 正则表达式提取出来的内容 返回是列表 里面的每一个元素都是元组
html_data = re.findall('<li><a href="/song\?id=(\d+)">(.*?)</a>', res.text)
for num_id, title in html_data:
    # 网易云的接口,使用这个地址来下载音乐数据
    # music_url = f"http://music.163.com/song/media/outer/url?id={num_id}.mp3"
    music_url = f"http://music.163.com/song/media/outer/url?id={num_id}.mp3"
    # 对音乐播放地址发送请求,获取二进制数据内容
    music_content = requests.get(url=music_url, headers=headers).content
    with open(file_name+title+".mp3", mode="wb") as file:
        file.write(music_content)
    print(num_id, title)

print("下载完毕!")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值