鱼C论坛

 找回密码
 立即注册
查看: 541|回复: 12

[已解决]Python爬虫06(朋友实训项目)

[复制链接]
发表于 2024-1-3 17:39:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在豆瓣音乐标签: 流行里只能爬取标题和链接,没有音乐家和音乐发布时间
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import xlwt
  4. url = "https://music.douban.com/tag/%E6%B5%81%E8%A1%8C?start=260&type=T"
  5. headers = {'User-Agent':
  6. 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36','Cookie':
  7. 'll="118254"; bid=hUyLZc0IQ-0; __utmc=30149280; __utmz=30149280.1704177535.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _pk_id.100001.afe6=e3aa424645194a40.1704178112.; __yadk_uid=vQ2OnDmCyRJ7MgONjIYqxroh3kmJOC0n; _vwo_uuid_v2=DC4889CAE9BF69AB947F1C739A359D3B1|c7a477b87f67bc643d65031d1e233036; dbcl2="276885079:IyaMMU84wwk"; ck=y-tF; push_noty_num=0; push_doumail_num=0; __utmv=30149280.27688; ap_v=0,6.0; _pk_ref.100001.afe6=%5B%22%22%2C%22%22%2C1704181059%2C%22https%3A%2F%2Fwww.douban.com%2F%22%5D; _pk_ses.100001.afe6=1; __utma=30149280.678212503.1704177535.1704177535.1704181060.2; __utmt=1;__utmb=30149280.3.9.1704181060'}
  8. r=requests.get(url,headers=headers)
  9. content=r.content.decode('utf-8')
  10. with open('douban.html','wb')as file:
  11.     file.write(r.content)
  12. title_list=[]
  13. href_list=[]
  14. for i in range(0,400,20):
  15.     url = 'https://music.douban.com/tag/%E6%B5%81%E8%A1%8C?start={i}&type=T'
  16.     soup=BeautifulSoup(content,'lxml')
  17.     divs=soup.find_all('div',class_="pl2")
  18.     for div in divs:
  19.         href=div.find('a')['href']
  20.         href_list.append(href)
  21.         title=div.find('a').text
  22.         title_list.append(title)


  23. print(href_list)
  24. print(title_list)
  25. wb=xlwt.Workbook()
  26. sheet1=wb.add_sheet('豆瓣音乐')
  27. sheet1.write(0,0,'标题')
  28. sheet1.write(0,1,'链接')

  29. for row in range(1,len(title_list)+1,1):
  30.     sheet1.write(row,0,title_list[row-1])
  31.     sheet1.write(row,1,href_list[row-1])

  32. wb.save(r'C:\Users\admin1\Desktop\34qc.xls')
  33. [font=宋体][size=4][size=5][/size][/size][/font]
复制代码
最佳答案
2024-1-3 17:39:52
代码有一些问题。首先,在循环中获取链接和标题时,应该将网页请求和解析放在循环内部,这样才能正确获取每一页的数据。其次,在写入Excel表格时,应该将每一个标题和链接写入不同的行,现在是将整个列表写入所有行。下面是修改后的代码:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import xlwt

  4. url = "https://music.douban.com/tag/%E6%B5%81%E8%A1%8C?start=260&type=T"
  5. headers = {'User-Agent':
  6.            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36','Cookie':
  7.            'll="118254"; bid=hUyLZc0IQ-0; __utmc=30149280; __utmz=30149280.1704177535.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _pk_id.100001.afe6=e3aa424645194a40.1704178112.; __yadk_uid=vQ2OnDmCyRJ7MgONjIYqxroh3kmJOC0n; _vwo_uuid_v2=DC4889CAE9BF69AB947F1C739A359D3B1|c7a477b87f67bc643d65031d1e233036; dbcl2="276885079:IyaMMU84wwk"; ck=y-tF; push_noty_num=0; push_doumail_num=0; __utmv=30149280.27688; ap_v=0,6.0; _pk_ref.100001.afe6=%5B%22%22%2C%22%22%2C1704181059%2C%22https%3A%2F%2Fwww.douban.com%2F%22%5D; _pk_ses.100001.afe6=1; __utma=30149280.678212503.1704177535.1704177535.1704181060.2; __utmt=1;__utmb=30149280.3.9.1704181060'}
  8. r = requests.get(url, headers=headers)
  9. content = r.content.decode('utf-8')

  10. title_list = []
  11. href_list = []

  12. for i in range(0, 400, 20):
  13.     url = f'https://music.douban.com/tag/%E6%B5%81%E8%A1%8C?start={i}&type=T'
  14.     r = requests.get(url, headers=headers)
  15.     soup = BeautifulSoup(r.content, 'lxml')
  16.     divs = soup.find_all('div', class_="pl2")
  17.     for div in divs:
  18.         href = div.find('a')['href']
  19.         href_list.append(href)
  20.         title = div.find('a').text.strip()
  21.         title_list.append(title)

  22. wb = xlwt.Workbook()
  23. sheet1 = wb.add_sheet('豆瓣音乐')
  24. sheet1.write(0, 0, '标题')
  25. sheet1.write(0, 1, '链接')

  26. for row in range(1, len(title_list) + 1, 1):
  27.     sheet1.write(row, 0, title_list[row-1])
  28.     sheet1.write(row, 1, href_list[row-1])

  29. wb.save(r'C:\Users\admin1\Desktop\34qc.xls')
复制代码


修改后的代码中,首先在循环内部发送网页请求和解析HTML,然后分别将标题和链接添加到对应的列表中。最后,在写入Excel表格时,将每一个标题和链接写入不同的行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-3 17:39:52 | 显示全部楼层    本楼为最佳答案   
代码有一些问题。首先,在循环中获取链接和标题时,应该将网页请求和解析放在循环内部,这样才能正确获取每一页的数据。其次,在写入Excel表格时,应该将每一个标题和链接写入不同的行,现在是将整个列表写入所有行。下面是修改后的代码:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import xlwt

  4. url = "https://music.douban.com/tag/%E6%B5%81%E8%A1%8C?start=260&type=T"
  5. headers = {'User-Agent':
  6.            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36','Cookie':
  7.            'll="118254"; bid=hUyLZc0IQ-0; __utmc=30149280; __utmz=30149280.1704177535.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _pk_id.100001.afe6=e3aa424645194a40.1704178112.; __yadk_uid=vQ2OnDmCyRJ7MgONjIYqxroh3kmJOC0n; _vwo_uuid_v2=DC4889CAE9BF69AB947F1C739A359D3B1|c7a477b87f67bc643d65031d1e233036; dbcl2="276885079:IyaMMU84wwk"; ck=y-tF; push_noty_num=0; push_doumail_num=0; __utmv=30149280.27688; ap_v=0,6.0; _pk_ref.100001.afe6=%5B%22%22%2C%22%22%2C1704181059%2C%22https%3A%2F%2Fwww.douban.com%2F%22%5D; _pk_ses.100001.afe6=1; __utma=30149280.678212503.1704177535.1704177535.1704181060.2; __utmt=1;__utmb=30149280.3.9.1704181060'}
  8. r = requests.get(url, headers=headers)
  9. content = r.content.decode('utf-8')

  10. title_list = []
  11. href_list = []

  12. for i in range(0, 400, 20):
  13.     url = f'https://music.douban.com/tag/%E6%B5%81%E8%A1%8C?start={i}&type=T'
  14.     r = requests.get(url, headers=headers)
  15.     soup = BeautifulSoup(r.content, 'lxml')
  16.     divs = soup.find_all('div', class_="pl2")
  17.     for div in divs:
  18.         href = div.find('a')['href']
  19.         href_list.append(href)
  20.         title = div.find('a').text.strip()
  21.         title_list.append(title)

  22. wb = xlwt.Workbook()
  23. sheet1 = wb.add_sheet('豆瓣音乐')
  24. sheet1.write(0, 0, '标题')
  25. sheet1.write(0, 1, '链接')

  26. for row in range(1, len(title_list) + 1, 1):
  27.     sheet1.write(row, 0, title_list[row-1])
  28.     sheet1.write(row, 1, href_list[row-1])

  29. wb.save(r'C:\Users\admin1\Desktop\34qc.xls')
复制代码


修改后的代码中,首先在循环内部发送网页请求和解析HTML,然后分别将标题和链接添加到对应的列表中。最后,在写入Excel表格时,将每一个标题和链接写入不同的行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-3 17:47:03 | 显示全部楼层
没有数据,爬取歌手,发行时间,相关链接
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-1-3 17:47:31 | 显示全部楼层
FishC 发表于 2024-1-3 17:39
代码有一些问题。首先,在循环中获取链接和标题时,应该将网页请求和解析放在循环内部,这样才能正确获取每 ...


没有数据,爬取歌手,发行时间,相关链接
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-3 17:47:49 | 显示全部楼层

没有数据,爬取歌手,发行时间,相关链接
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-3 17:47:52 | 显示全部楼层
liyifeng295641 发表于 2024-01-03 17:47
没有数据,爬取歌手,发行时间,相关链接


我了解到您想要爬取豆瓣音乐标签中流行音乐的歌手、发行时间和相关链接。下面是修改后的代码来实现这个需求:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import xlwt

  4. url = "https://music.douban.com/tag/%E6%B5%81%E8%A1%8C?start=0&type=T"
  5. headers = {
  6.     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
  7.     'Cookie': 'll="118254"; bid=hUyLZc0IQ-0; __utmc=30149280; __utmz=30149280.1704177535.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _pk_id.100001.afe6=e3aa424645194a40.1704178112.; __yadk_uid=vQ2OnDmCyRJ7MgONjIYqxroh3kmJOC0n; _vwo_uuid_v2=DC4889CAE9BF69AB947F1C739A359D3B1|c7a477b87f67bc643d65031d1e233036; dbcl2="276885079:IyaMMU84wwk"; ck=y-tF; push_noty_num=0; push_doumail_num=0; __utmv=30149280.27688; ap_v=0,6.0; _pk_ref.100001.afe6=%5B%22%22%2C%22%22%2C1704181059%2C%22https%3A%2F%2Fwww.douban.com%2F%22%5D; _pk_ses.100001.afe6=1; __utma=30149280.678212503.1704177535.1704177535.1704181060.2; __utmt=1;__utmb=30149280.3.9.1704181060'
  8. }

  9. r = requests.get(url, headers=headers)
  10. soup = BeautifulSoup(r.content, 'lxml')

  11. data_list = []

  12. for item in soup.find_all('div', class_='pl2'):
  13.     title = item.find('a').text.strip()  # 标题
  14.     href = item.find('a')['href']  # 相关链接

  15.     r_item = requests.get(href, headers=headers)
  16.     soup_item = BeautifulSoup(r_item.content, 'lxml')
  17.    
  18.     artist = soup_item.find('span', class_='pl').text.split(':')[1].strip()  # 歌手
  19.     release_time = soup_item.find('span', class_='p2').text.strip()  # 发行时间

  20.     data_list.append([title, artist, release_time, href])

  21. wb = xlwt.Workbook()
  22. sheet1 = wb.add_sheet('豆瓣音乐')
  23. sheet1.write(0, 0, '标题')
  24. sheet1.write(0, 1, '歌手')
  25. sheet1.write(0, 2, '发行时间')
  26. sheet1.write(0, 3, '链接')

  27. for row, data in enumerate(data_list, start=1):
  28.     for col, value in enumerate(data):
  29.         sheet1.write(row, col, value)

  30. wb.save('douban_music.xls')
复制代码


这段代码首先发送请求获取网页内容,然后使用BeautifulSoup解析网页。之后,循环遍历每个音乐项,提取标题和相关链接。接下来,发送相关链接的请求,获取歌手和发行时间的信息,并将这些信息保存在一个列表中。最后,将列表中的数据写入Excel文件。

请注意,为了能够正确获取歌手和发行时间的信息,我对每个音乐项的相关链接进行了额外的请求和解析操作。这可能会导致爬取速度变慢。如果您觉得速度较慢,可以考虑提前获取所有相关链接,再进行批量请求和解析。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-3 17:50:19 | 显示全部楼层
FishC 发表于 2024-1-3 17:47
我了解到您想要爬取豆瓣音乐标签中流行音乐的歌手、发行时间和相关链接。下面是修改后的代码来实现这个 ...

Traceback (most recent call last):
  File "D:\Pycharm\PythonProject\main.py", line 24, in <module>
    release_time = soup_item.find('span', class_='p2').text.strip()  # 发行时间
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'text'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-3 17:50:42 | 显示全部楼层
cd132 发表于 2024-01-03 17:50
Traceback (most recent call last):
  File "D:\Pyc ...


您遇到了一个属性错误:'NoneType' object has no attribute 'text',这意味着在执行`soup_item.find('span', class_='p2').text.strip()`时,找不到符合条件的元素。这可能是因为没有发行时间的元素存在,或者选择器选择的是错误的元素。

为了避免出现这个错误,您可以使用`find()`方法的返回值进行判断。如果返回的结果是`None`,则说明没有找到对应的元素,此时可以给发行时间赋予一个默认值,例如"未知"。

下面是修改后的代码:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import xlwt

  4. url = "https://music.douban.com/tag/%E6%B5%81%E8%A1%8C?start=0&type=T"
  5. headers = {
  6.     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
  7.     'Cookie': 'll="118254"; bid=hUyLZc0IQ-0; __utmc=30149280; __utmz=30149280.1704177535.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _pk_id.100001.afe6=e3aa424645194a40.1704178112.; __yadk_uid=vQ2OnDmCyRJ7MgONjIYqxroh3kmJOC0n; _vwo_uuid_v2=DC4889CAE9BF69AB947F1C739A359D3B1|c7a477b87f67bc643d65031d1e233036; dbcl2="276885079:IyaMMU84wwk"; ck=y-tF; push_noty_num=0; push_doumail_num=0; __utmv=30149280.27688; ap_v=0,6.0; _pk_ref.100001.afe6=%5B%22%22%2C%22%22%2C1704181059%2C%22https%3A%2F%2Fwww.douban.com%2F%22%5D; _pk_ses.100001.afe6=1; __utma=30149280.678212503.1704177535.1704177535.1704181060.2; __utmt=1;__utmb=30149280.3.9.1704181060'
  8. }

  9. r = requests.get(url, headers=headers)
  10. soup = BeautifulSoup(r.content, 'lxml')

  11. data_list = []

  12. for item in soup.find_all('div', class_='pl2'):
  13.     title = item.find('a').text.strip()  # 标题
  14.     href = item.find('a')['href']  # 相关链接
  15.    
  16.     r_item = requests.get(href, headers=headers)
  17.     soup_item = BeautifulSoup(r_item.content, 'lxml')
  18.    
  19.     artist = soup_item.find('span', class_='pl').text.split(':')[1].strip() if soup_item.find('span', class_='pl') else "未知"  # 歌手
  20.     release_time = soup_item.find('span', class_='p2').text.strip() if soup_item.find('span', class_='p2') else "未知"  # 发行时间
  21.    
  22.     data_list.append([title, artist, release_time, href])

  23. wb = xlwt.Workbook()
  24. sheet1 = wb.add_sheet('豆瓣音乐')
  25. sheet1.write(0, 0, '标题')
  26. sheet1.write(0, 1, '歌手')
  27. sheet1.write(0, 2, '发行时间')
  28. sheet1.write(0, 3, '链接')

  29. for row, data in enumerate(data_list, start=1):
  30.     for col, value in enumerate(data):
  31.         sheet1.write(row, col, value)

  32. wb.save('douban_music.xls')
复制代码


这样,如果没有找到对应的歌手或发行时间,会将其设置为"未知"。您可以根据实际需求修改设置的默认值。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-3 17:59:24 | 显示全部楼层
FishC 发表于 2024-1-3 17:39
代码有一些问题。首先,在循环中获取链接和标题时,应该将网页请求和解析放在循环内部,这样才能正确获取每 ...

在豆瓣音乐标签: 流行里面只能爬取第一行标题和链接,不能爬取第二行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-3 17:59:41 | 显示全部楼层
cd132 发表于 2024-01-03 17:59
在豆瓣音乐标签: 流行里面只能爬取第一行标题和链接, ...


原因是在循环内部的提取标题和链接的代码中,我们没有针对每一行进行循环,而是直接获取了第一个div标签的数据。为了解决这个问题,我们需要对每一个div标签进行遍历,并依次获取每一行的标题和链接。下面是修改后的代码:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import xlwt

  4. url = "https://music.douban.com/tag/%E6%B5%81%E8%A1%8C?start=260&type=T"
  5. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
  6.            'Cookie': 'll="118254"; bid=hUyLZc0IQ-0; __utmc=30149280; __utmz=30149280.1704177535.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _pk_id.100001.afe6=e3aa424645194a40.1704178112.; __yadk_uid=vQ2OnDmCyRJ7MgONjIYqxroh3kmJOC0n; _vwo_uuid_v2=DC4889CAE9BF69AB947F1C739A359D3B1|c7a477b87f67bc643d65031d1e233036; dbcl2="276885079:IyaMMU84wwk"; ck=y-tF; push_noty_num=0; push_doumail_num=0; __utmv=30149280.27688; ap_v=0,6.0; _pk_ref.100001.afe6=%5B%22%22%2C%22%22%2C1704181059%2C%22https%3A%2F%2Fwww.douban.com%2F%22%5D; _pk_ses.100001.afe6=1; __utma=30149280.678212503.1704177535.1704177535.1704181060.2; __utmt=1;__utmb=30149280.3.9.1704181060'}

  7. r = requests.get(url, headers=headers)
  8. soup = BeautifulSoup(r.content, 'lxml')

  9. title_list = []
  10. href_list = []

  11. divs = soup.find_all('div', class_="pl2")
  12. for div in divs:
  13.     href = div.find('a')['href']
  14.     title = div.find('a').text.strip()
  15.     href_list.append(href)
  16.     title_list.append(title)

  17. wb = xlwt.Workbook()
  18. sheet1 = wb.add_sheet('豆瓣音乐')
  19. sheet1.write(0, 0, '标题')
  20. sheet1.write(0, 1, '链接')

  21. for row in range(1, len(title_list) + 1, 1):
  22.     sheet1.write(row, 0, title_list[row-1])
  23.     sheet1.write(row, 1, href_list[row-1])

  24. wb.save(r'C:\Users\admin1\Desktop\34qc.xls')
复制代码


在修改后的代码中,我们对每一个div标签进行了遍历,通过`div.find('a')['href']`来获取链接,通过`div.find('a').text.strip()`来获取标题,并将它们分别添加到链接列表和标题列表中。然后,再通过循环将每一行的标题和链接写入对应的单元格。这样就可以获取到所有行的数据了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-3 18:08:00 | 显示全部楼层
按照这个基础,爬取表演者,发行时间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-3 18:10:17 | 显示全部楼层
爬取标题,表演者,发行时间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-3 18:16:30 | 显示全部楼层

在豆瓣音乐标签: 流行里面只爬取标题,表演者,发行时间,链接

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 06:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表