目录

一、爬虫设计的技术:

1、数据获取:

2、数据提取:

3、数据存储:

备注:

二、分步代码展示:

0、需要引入的库:

1、列举出需要爬虫的所有页面

2、在每个页面抓取包含的网址信息

3、抓取专辑页面中的信息

4、存储获取的信息

 三、爬虫的全部代码:


一、爬虫设计的技术:

1、数据获取:

通过http获取网站的数据,如urllib,urllib2,requests等模块。

2、数据提取:

将web站点所获取的数据进行处理,获取所需要的数据,常使用的技术有:正则re,BeautifulSoup,xpath等。

3、数据存储:

将获取的数据有效的存储,常见的存储方式包括:TXT文件,csv文件,Excel,MongoDB数据库,MySQL数据库等。

备注:

本文通过requests模块获取数据,通过BeautifulSoup模块提取数据,通过csv文件存储数据。

二、分步代码展示:

0、需要引入的库:

import requests
from bs4 import BeautifulSoup
import csv
import re
import time
import datetime
import random

1、列举出需要爬虫的所有页面

# 使用列表推导式实现页码的增加,打印出来就一个包含所有网址的列表。
urls = ["https://music.douban.com/top250?start={}".format(str(i)) for i in range(0, 250, 25)]
print(urls)

执行结果如下图:

打印urls是一个列表,分别列出每页的网址,尾数是从0-250的等差为25的等差数列。

2、在每个页面抓取包含的网址信息

import requests
from bs4 import BeautifulSoup

# 模拟浏览器的headers,User-Agent用户代理
header = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"}
# 抓取指定Top250排行榜页面
def get_url_music(url):
    html = requests.get(url,headers=header) # 获取整个页面的信息
    soup = BeautifulSoup(html.text,'lxml') # 获取数据,使用lxml引擎
    a_tags = soup.find_all('a',attrs={'class':'nbg'})  # 方法选择器,提供一系列的方法。第一个参数指定节点名字,第二个参数是指定属性名字
    # for a_tag in a_tags: # 循环获取整个页面中包含的网址信息,是一个列表。
    #    print(a_tag['herf'])
    return a_tags


if __name__ == '__main__':
    # 使用列表推导式实现页码的增加
    urls = ["https://music.douban.com/top250?start={}".format(str(i)) for i in range(0, 250, 25)]
    for url in urls:
        tags_lest = get_url_music(url)
        with open('musics.txt', "a") as f:
            for a_tag in tags_lest:
                print(a_tag)
                print(a_tag['href'], type(a_tag))
                f.write(a_tag['href'] + '\n')

执行结果如下图:

访问每个页面,从其中爬取每首歌曲的网页的网址,写到TXT文本文档中。利用python爬取豆瓣音乐TOP250的数据----爬取的247首歌曲的网址-Python文档类资源-CSDN文库

3、抓取专辑页面中的信息


import requests
from bs4 import BeautifulSoup
import re
header = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"}

# 抓取专辑页面中的信息
def get_musics_info(url):
    html = requests.get(url,headers=header,timeout = 100)
    soup = BeautifulSoup(html.text,'lxml')
    # 获取专辑的名字
    name = soup.find(attrs={'id':'wrapper'}).h1.span.text
    print('专辑名称:{}'.format(name))
    # 获取表演者的名字
    author = soup.find(attrs={'id':'info'}).find('a').text
    print('作者:{}'.format(author))
    # 获取专辑的流派
    type = re.findall('<span class="pl">流派:</span>&nbsp;(.*?)<br />',html.text,re.S)
    if len(type) == 0:
        print('未知')
    else:
        print('流派:{}'.format(type[0].strip()))
    # 获取专辑的发行时间
    time = re.findall('<span class="pl">发行时间:</span>&nbsp;(.*?)<br />',html.text,re.S)[0].strip()
    print('发行时间:{}'.format(time))
    # 获取出版者
    publishers = re.findall('>出版者:</span>&nbsp;(.*?)<br />',html.text,re.S)
    if len(publishers) == 0:
        publishers = '未知'
    else:
        publishers = publishers[0].strip()
        return '出版者:{}'.format(publishers)
    
print(get_musics_info('https://music.douban.com/subject/2995812/'))

 执行结果如下图:

通过第一首歌的网址进入详情页面,然后爬取歌曲的一系列的相关信息。

4、存储获取的信息

import csv
# 保存分析结果
def save_csv(filename,info):
    with open(filename,'a',encoding='utf-8-sig',newline='') as f: # encoding是编码格式,避免打开csv乱码。newline是去除空行的作用
        fieldnames = ['name','author','style','time','publishers']
        writer = csv.DictWriter(f,fieldnames=fieldnames)
        writer.writeheader() # 将表格的表头写上去
        writer.writerow(info) # 将info字典包含的内容写入csv中
      
info = {
        'name':'aaa',
        'author':'bbb',
        'style':'ccc',
        'time':'ddd',
        'publishers':'eee'
    }
save_csv('aa.csv',info)

执行结果如下图:

 三、爬虫的全部代码:

"""
author:laxingbudui
date:2022-8-22
desc:抓取豆瓣音乐top250排行榜的数据,并将数据保存在CSV文件中
爬虫网站:https://music.douban.com/top250?start=0
"""

import requests
from bs4 import BeautifulSoup
import csv
import re
import time
import datetime
import random


headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}

# 如果爬虫过程中,连接中断,可以解开以下注释,代替headers
"""
user_agent_list = [ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
                    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
                    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
                    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
                    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
                    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
                    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
                    ]
headers = {'User-Agent' : random.choice(user_agent_list)}
"""

# 抓取指定top250排行榜页面
def get_url_music(url): 
    html = requests.get(url,headers=headers,timeout=100) # headers请求头,模拟浏览器访问网页,否则会被反爬,timeout超时时间,超过时间会抛出异常
    print(type(html))
    print(html.status_code) # 是否连接网页成功,200是成功,404是不成功,403是没有权限访问磁网站
    # print(html.text) # 字符串的形式显示网页
    soup = BeautifulSoup(html.text,'lxml') # 使用lxml引擎解释网页
    aTags = soup.find_all('a',attrs={'class': 'nbg'}) # 获取a节点中,class(样式)属性的值为nbg的文本内容
    for atag in aTags:
        now_time = datetime.datetime.now()
        print(now_time)
        print(atag['href'],atag['title']) # 
        get_music_info(filename,atag['href'])

# 抓取专辑页面中的信息
def get_music_info(filename,url):
    html = requests.get(url,headers=headers,timeout=200)
    soup = BeautifulSoup(html.text,'lxml')
    # 获取专辑的名称
    name = soup.find(attrs={'id':'wrapper'}).h1.span.text
    print('专辑名称:{}'.format(name))
    # 获取表演者
    author = soup.find(attrs={'id':'info'}).find('a').text
    print('作者:{}'.format(author))
    # 获取流派
    style = re.findall('<span class="pl">流派:</span>&nbsp;(.*?)<br />',html.text,re.S)
    if len(style) == 0:
        style = '未知'
    else:
        style = style[0].strip()
        print('流派:{}'.format(style))
    # 获取发行时间
    time = re.findall('发行时间:</span>&nbsp;(.*?)<br />',html.text,re.S)[0].strip()
    print(time)
    # 获取出版者
    publishers = re.findall('>出版者:</span>&nbsp;(.*?)<br />',html.text,re.S)
    if len(publishers) == 0:
        publishers = '未知'
    else:
        publishers = publishers[0].strip()
        print(publishers)
    # 将获取的信息整合成一个字典存储起来
    info = {
        'name':name,
        'author':author,
        'style':style,
        'time':time,
        'publishers':publishers
    }
    print(info)
    save_csv(filename,info)
# 保存分析结果
def save_csv(filename,info):
    with open(filename,'a',encoding='utf-8-sig',newline='') as f:
        fieldnames = ['name','author','style','time','publishers']
        writer = csv.DictWriter(f,fieldnames=fieldnames)
        writer.writerow(info)
    

if __name__ == '__main__':
    urls = ['https://music.douban.com/top250?start={}'.format(str(i)) for i in range(0,250,25)]
    print(urls)
    filename = 'music.csv'
    # csv用Excel打开有乱码,将encoding = 'utf-8'改为encoding='utf-8-sig',表格有空行增加上newline=''
    # 需要说明的是,豆瓣页面上第4、5、6页只有24首(不是25首),所以总数量是247,不是250。不是爬虫代码有问题,是豆瓣页面上就只有247条数据。
    with open(filename, 'w', encoding='utf-8-sig',newline='') as f:
        fieldnames = ['name', 'author', 'style', 'time', 'publishers']
        writer = csv.DictWriter(f,fieldnames = fieldnames) 
        writer.writeheader()
    for url in urls:
        get_url_music(url)
        time.sleep(1)

执行结果如下图:

 最终生成的文件我也上传到CSDN网站,可以下载与你生成的文件做一下比较。利用python爬取豆瓣音乐TOP250的数据----最终结果生成一个music.csv文件-Python文档类资源-CSDN文库

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐