您现在的位置是:首页 > 技术教程 正文

【python】六个常见爬虫案例【附源码】

admin 阅读: 2024-03-19
后台-插件-广告管理-内容页头部广告(手机)

        大家好,我是博主英杰,整理了几个常见的爬虫案例,分享给大家,适合小白学习

一、爬取豆瓣电影排行榜Top250存储到Excel文件

        近年来,Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程序,用于抓取豆瓣电影Top250的相关信息,并将其保存为Excel文件。

获取网页数据的函数,包括以下步骤:
1. 循环10次,依次爬取不同页面的信息;
2. 使用`urllib`获取html页面;
3. 使用`BeautifulSoup`解析页面;
4. 遍历每个div标签,即每一部电影;
5. 对每个电影信息进行匹配,使用正则表达式提取需要的信息并保存到一个列表中;
6. 将每个电影信息的列表保存到总列表中。

        效果展示:

c387fe10d7d54df2b1455c8052d8f2fd.png

5c2a8e73dba34b48a2c368070ef19b50.png

        源代码:

  1. from bs4 import BeautifulSoup
  2. import re #正则表达式,进行文字匹配
  3. import urllib.request,urllib.error #指定URL,获取网页数据
  4. import xlwt #进行excel操作
  5. def main():
  6. baseurl = "https://movie.douban.com/top250?start="
  7. datalist= getdata(baseurl)
  8. savepath = ".\\豆瓣电影top250.xls"
  9. savedata(datalist,savepath)
  10. #compile返回的是匹配到的模式对象
  11. findLink = re.compile(r'') # 正则表达式模式的匹配,影片详情
  12. findImgSrc = re.compile(r', re.S) # re.S让换行符包含在字符中,图片信息
  13. findTitle = re.compile(r'(.*)') # 影片片名
  14. findRating = re.compile(r'(.*)') # 找到评分
  15. findJudge = re.compile(r'(\d*)人评价') # 找到评价人数 #\d表示数字
  16. findInq = re.compile(r'(.*)') # 找到概况
  17. findBd = re.compile(r'

    (.*?)

    '
    , re.S) # 找到影片的相关内容,如导演,演员等
  18. ##获取网页数据
  19. def getdata(baseurl):
  20. datalist=[]
  21. for i in range(0,10):
  22. url = baseurl+str(i*25) ##豆瓣页面上一共有十页信息,一页爬取完成后继续下一页
  23. html = geturl(url)
  24. soup = BeautifulSoup(html,"html.parser") #构建了一个BeautifulSoup类型的对象soup,是解析html的
  25. for item in soup.find_all("div",class_='item'): ##find_all返回的是一个列表
  26. data=[] #保存HTML中一部电影的所有信息
  27. item = str(item) ##需要先转换为字符串findall才能进行搜索
  28. link = re.findall(findLink,item)[0] ##findall返回的是列表,索引只将值赋值
  29. data.append(link)
  30. imgSrc = re.findall(findImgSrc, item)[0]
  31. data.append(imgSrc)
  32. titles=re.findall(findTitle,item) ##有的影片只有一个中文名,有的有中文和英文
  33. if(len(titles)==2):
  34. onetitle = titles[0]
  35. data.append(onetitle)
  36. twotitle = titles[1].replace("/","")#去掉无关的符号
  37. data.append(twotitle)
  38. else:
  39. data.append(titles)
  40. data.append(" ") ##将下一个值空出来
  41. rating = re.findall(findRating, item)[0] # 添加评分
  42. data.append(rating)
  43. judgeNum = re.findall(findJudge, item)[0] # 添加评价人数
  44. data.append(judgeNum)
  45. inq = re.findall(findInq, item) # 添加概述
  46. if len(inq) != 0:
  47. inq = inq[0].replace("。", "")
  48. data.append(inq)
  49. else:
  50. data.append(" ")
  51. bd = re.findall(findBd, item)[0]
  52. bd = re.sub('(\s+)?', " ", bd)
  53. bd = re.sub('/', " ", bd)
  54. data.append(bd.strip()) # 去掉前后的空格
  55. datalist.append(data)
  56. return datalist
  57. ##保存数据
  58. def savedata(datalist,savepath):
  59. workbook = xlwt.Workbook(encoding="utf-8",style_compression=0) ##style_compression=0不压缩
  60. worksheet = workbook.add_sheet("豆瓣电影top250",cell_overwrite_ok=True) #cell_overwrite_ok=True再次写入数据覆盖
  61. column = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概况", "相关信息") ##execl项目栏
  62. for i in range(0,8):
  63. worksheet.write(0,i,column[i]) #将column[i]的内容保存在第0行,第i列
  64. for i in range(0,250):
  65. data = datalist[i]
  66. for j in range(0,8):
  67. worksheet.write(i+1,j,data[j])
  68. workbook.save(savepath)
  69. ##爬取网页
  70. def geturl(url):
  71. head = {
  72. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
  73. "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"
  74. }
  75. req = urllib.request.Request(url,headers=head)
  76. try: ##异常检测
  77. response = urllib.request.urlopen(req)
  78. html = response.read().decode("utf-8")
  79. except urllib.error.URLError as e:
  80. if hasattr(e,"code"): ##如果错误中有这个属性的话
  81. print(e.code)
  82. if hasattr(e,"reason"):
  83. print(e.reason)
  84. return html
  85. if __name__ == '__main__':
  86. main()
  87. print("爬取成功!!!")

二、爬取百度热搜排行榜Top50+可视化

      2.1  代码思路:

  1. 导入所需的库:

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

requests 库用于发送HTTP请求获取网页内容。

BeautifulSoup 库用于解析HTML页面的内容。

openpyxl 库用于创建和操作Excel文件。

        2.发起HTTP请求获取百度热搜页面内容:

  1. url = 'https://top.baidu.com/board?tab=realtime'
  2. response = requests.get(url)
  3. html = response.content

这里使用了 requests.get() 方法发送GET请求,并将响应的内容赋值给变量 html。

        3.使用BeautifulSoup解析页面内容:

soup = BeautifulSoup(html, 'html.parser')

创建一个 BeautifulSoup 对象,并传入要解析的HTML内容和解析器类型。

        4.提取热搜数据:

  1. hot_searches = []
  2. for item in soup.find_all('div', {'class': 'c-single-text-ellipsis'}):
  3.    hot_searches.append(item.text)

这段代码通过调用 soup.find_all() 方法找到所有 标签,并且指定 class 属性为 'c-single-text-ellipsis' 的元素。

然后,将每个元素的文本内容添加到 hot_searches 列表中。

        5.保存热搜数据到Excel:

  1. workbook = openpyxl.Workbook()
  2. sheet = workbook.active
  3. sheet.title = 'Baidu Hot Searches'

使用 openpyxl.Workbook() 创建一个新的工作簿对象。

调用 active 属性获取当前活动的工作表对象,并将其赋值给变量 sheet。

使用 title 属性给工作表命名为 'Baidu Hot Searches'。

        6.设置标题:

sheet.cell(row=1, column=1, value='百度热搜排行榜—博主:Yan-英杰')

使用 cell() 方法选择要操作的单元格,其中 row 和 column 参数分别表示行和列的索引。

将标题字符串 '百度热搜排行榜—博主:Yan-英杰' 写入选定的单元格。

        7.写入热搜数据:

  1. for i in range(len(hot_searches)):
  2.    sheet.cell(row=i+2, column=1, value=hot_searches[i])

使用 range() 函数生成一个包含索引的范围,循环遍历 hot_searches 列表。

对于每个索引 i,使用 cell() 方法将对应的热搜词写入Excel文件中。

        8.保存Excel文件:

workbook.save('百度热搜.xlsx')

使用 save() 方法将工作簿保存到指定的文件名 '百度热搜.xlsx'。

        9.输出提示信息:

print('热搜数据已保存到 百度热搜.xlsx')

在控制台输出保存成功的提示信息。

 效果展示:

36233b88b5d7418ba4a81c8eea01240e.png

ae00193341d942509dc0020f88ec8878.png

 

源代码:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import openpyxl
  4. # 发起HTTP请求获取百度热搜页面内容
  5. url = 'https://top.baidu.com/board?tab=realtime'
  6. response = requests.get(url)
  7. html = response.content
  8. # 使用BeautifulSoup解析页面内容
  9. soup = BeautifulSoup(html, 'html.parser')
  10. # 提取热搜数据
  11. hot_searches = []
  12. for item in soup.find_all('div', {'class': 'c-single-text-ellipsis'}):
  13. hot_searches.append(item.text)
  14. # 保存热搜数据到Excel
  15. workbook = openpyxl.Workbook()
  16. sheet = workbook.active
  17. sheet.title = 'Baidu Hot Searches'
  18. # 设置标题
  19. sheet.cell(row=1, column=1, value='百度热搜排行榜—博主:Yan-英杰')
  20. # 写入热搜数据
  21. for i in range(len(hot_searches)):
  22. sheet.cell(row=i+2, column=1, value=hot_searches[i])
  23. workbook.save('百度热搜.xlsx')
  24. print('热搜数据已保存到 百度热搜.xlsx')

        可视化代码:

        

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import matplotlib.pyplot as plt
  4. # 发起HTTP请求获取百度热搜页面内容
  5. url = 'https://top.baidu.com/board?tab=realtime'
  6. response = requests.get(url)
  7. html = response.content
  8. # 使用BeautifulSoup解析页面内容
  9. soup = BeautifulSoup(html, 'html.parser')
  10. # 提取热搜数据
  11. hot_searches = []
  12. for item in soup.find_all('div', {'class': 'c-single-text-ellipsis'}):
  13. hot_searches.append(item.text)
  14. # 设置中文字体
  15. plt.rcParams['font.sans-serif'] = ['SimHei']
  16. plt.rcParams['axes.unicode_minus'] = False
  17. # 绘制条形图
  18. plt.figure(figsize=(15, 10))
  19. x = range(len(hot_searches))
  20. y = list(reversed(range(1, len(hot_searches)+1)))
  21. plt.barh(x, y, tick_label=hot_searches, height=0.8) # 调整条形图的高度
  22. # 添加标题和标签
  23. plt.title('百度热搜排行榜')
  24. plt.xlabel('排名')
  25. plt.ylabel('关键词')
  26. # 调整坐标轴刻度
  27. plt.xticks(range(1, len(hot_searches)+1))
  28. # 调整条形图之间的间隔
  29. plt.subplots_adjust(hspace=0.8, wspace=0.5)
  30. # 显示图形
  31. plt.tight_layout()
  32. plt.show()

三、爬取斗鱼直播照片保存到本地目录

         效果展示: 

        3038d65371de41c7b6a56b0f0c9a7769.png

a2d641f57c4a40e5a2882ef06fa1774a.png

        源代码:

        

  1. #导入了必要的模块requests和os
  2. import requests
  3. import os
  4. # 定义了一个函数get_html(url),
  5. # 用于发送GET请求获取指定URL的响应数据。函数中设置了请求头部信息,
  6. # 以模拟浏览器的请求。函数返回响应数据的JSON格式内容
  7. def get_html(url):
  8. header = {
  9. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
  10. }
  11. response = requests.get(url=url, headers=header)
  12. # print(response.json())
  13. html = response.json()
  14. return html
  15. # 定义了一个函数parse_html(html),
  16. # 用于解析响应数据中的图片信息。通过分析响应数据的结构,
  17. # 提取出每个图片的URL和标题,并将其存储在一个字典中,然后将所有字典组成的列表返回
  18. def parse_html(html):
  19. rl_list = html['data']['rl']
  20. # print(rl_list)
  21. img_info_list = []
  22. for rl in rl_list:
  23. img_info = {}
  24. img_info['img_url'] = rl['rs1']
  25. img_info['title'] = rl['nn']
  26. # print(img_url)
  27. # exit()
  28. img_info_list.append(img_info)
  29. # print(img_info_list)
  30. return img_info_list
  31. # 定义了一个函数save_to_images(img_info_list),用于保存图片到本地。
  32. # 首先创建一个目录"directory",如果目录不存在的话。然后遍历图片信息列表,
  33. # 依次下载每个图片并保存到目录中,图片的文件名为标题加上".jpg"后缀。
  34. def save_to_images(img_info_list):
  35. dir_path = 'directory'
  36. if not os.path.exists(dir_path):
  37. os.makedirs(dir_path)
  38. for img_info in img_info_list:
  39. img_path = os.path.join(dir_path, img_info['title'] + '.jpg')
  40. res = requests.get(img_info['img_url'])
  41. res_img = res.content
  42. with open(img_path, 'wb') as f:
  43. f.write(res_img)
  44. # exit()
  45. #在主程序中,设置了要爬取的URL,并调用前面定义的函数来执行爬取、解析和保存操作。
  46. if __name__ == '__main__':
  47. url = 'https://www.douyu.com/gapi/rknc/directory/yzRec/1'
  48. html = get_html(url)
  49. img_info_list = parse_html(html)
  50. save_to_images(img_info_list)

 四、爬取酷狗音乐Top500排行榜

          从酷狗音乐排行榜中提取歌曲的排名、歌名、歌手和时长等信息

        代码思路:2fe69b3ebc4448c8a4b447a8bc73cd43.png

        效果展示:

                482bba649ea346e1aec5d8d41f8e639f.png

        源码:

        

  1. import requests # 发送网络请求,获取 HTML 等信息
  2. from bs4 import BeautifulSoup # 解析 HTML 信息,提取需要的信息
  3. import time # 控制爬虫速度,防止过快被封IP
  4. headers = {
  5. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"
  6. # 添加浏览器头部信息,模拟请求
  7. }
  8. def get_info(url):
  9. # 参数 url :要爬取的网页地址
  10. web_data = requests.get(url, headers=headers) # 发送网络请求,获取 HTML 等信息
  11. soup = BeautifulSoup(web_data.text, 'lxml') # 解析 HTML 信息,提取需要的信息
  12. # 通过 CSS 选择器定位到需要的信息
  13. ranks = soup.select('span.pc_temp_num')
  14. titles = soup.select('div.pc_temp_songlist > ul > li > a')
  15. times = soup.select('span.pc_temp_tips_r > span')
  16. # for 循环遍历每个信息,并将其存储到字典中
  17. for rank, title, time in zip(ranks, titles, times):
  18. data = {
  19. "rank": rank.get_text().strip(), # 歌曲排名
  20. "singer": title.get_text().replace("\n", "").replace("\t", "").split('-')[1], # 歌手名
  21. "song": title.get_text().replace("\n", "").replace("\t", "").split('-')[0], # 歌曲名
  22. "time": time.get_text().strip() # 歌曲时长
  23. }
  24. print(data) # 打印获取到的信息
  25. if __name__ == '__main__':
  26. urls = ["https://www.kugou.com/yy/rank/home/{}-8888.html".format(str(i)) for i in range(1, 24)]
  27. # 构造要爬取的页面地址列表
  28. for url in urls:
  29. get_info(url) # 调用函数,获取页面信息
  30. time.sleep(1) # 控制爬虫速度,防止过快被封IP

五、爬取链家二手房数据做数据分析

        在数据分析和挖掘领域中,网络爬虫是一种常见的工具,用于从网页上收集数据。介绍如何使用 Python 编写简单的网络爬虫程序,从链家网上海二手房页面获取房屋信息,并将数据保存到 Excel 文件中。

        效果图:

        3a92a4dd5a864552934397f7918f8925.png

        代码思路:

  首先,我们定义了一个函数 fetch_data(page_number),用于获取指定页面的房屋信息数据。这个函数会构建对应页数的 URL,并发送 GET 请求获取页面内容。然后,使用 BeautifulSoup 解析页面内容,并提取每个房屋信息的相关数据,如区域、房型、关注人数、单价和总价。最终将提取的数据以字典形式存储在列表中,并返回该列表。

        接下来,我们定义了主函数 main(),该函数控制整个爬取和保存数据的流程。在主函数中,我们循环爬取前 10 页的数据,调用 fetch_data(page_number) 函数获取每一页的数据,并将数据追加到列表中。然后,将所有爬取的数据存储在 DataFrame 中,并使用 df.to_excel('lianjia_data.xlsx', index=False) 将数据保存到 Excel 文件中。

        最后,在程序的入口处,通过 if __name__ == "__main__": 来执行主函数 main()。

        源代码:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import pandas as pd
  4. # 收集单页数据 xpanx.com
  5. def fetch_data(page_number):
  6. url = f"https://sh.lianjia.com/ershoufang/pg{page_number}/"
  7. response = requests.get(url)
  8. if response.status_code != 200:
  9. print("请求失败")
  10. return []
  11. soup = BeautifulSoup(response.text, 'html.parser')
  12. rows = []
  13. for house_info in soup.find_all("li", {"class": "clear LOGVIEWDATA LOGCLICKDATA"}):
  14. row = {}
  15. # 使用您提供的类名来获取数据 xpanx.com
  16. row['区域'] = house_info.find("div", {"class": "positionInfo"}).get_text() if house_info.find("div", {
  17. "class": "positionInfo"}) else None
  18. row['房型'] = house_info.find("div", {"class": "houseInfo"}).get_text() if house_info.find("div", {
  19. "class": "houseInfo"}) else None
  20. row['关注'] = house_info.find("div", {"class": "followInfo"}).get_text() if house_info.find("div", {
  21. "class": "followInfo"}) else None
  22. row['单价'] = house_info.find("div", {"class": "unitPrice"}).get_text() if house_info.find("div", {
  23. "class": "unitPrice"}) else None
  24. row['总价'] = house_info.find("div", {"class": "priceInfo"}).get_text() if house_info.find("div", {
  25. "class": "priceInfo"}) else None
  26. rows.append(row)
  27. return rows
  28. # 主函数
  29. def main():
  30. all_data = []
  31. for i in range(1, 11): # 爬取前10页数据作为示例
  32. print(f"正在爬取第{i}页...")
  33. all_data += fetch_data(i)
  34. # 保存数据到Excel xpanx.com
  35. df = pd.DataFrame(all_data)
  36. df.to_excel('lianjia_data.xlsx', index=False)
  37. print("数据已保存到 'lianjia_data.xlsx'")
  38. if __name__ == "__main__":
  39. main()

 六、爬取豆瓣电影排行榜TOP250存储到CSV文件中

        代码思路:

        

        首先,我们导入了需要用到的三个Python模块:requests、lxml和csv。

        然后,我们定义了豆瓣电影TOP250页面的URL地址,并使用getSource(url)函数获取网页源码。

        接着,我们定义了一个getEveryItem(source)函数,它使用XPath表达式从HTML源码中提取出每部电影的标题、URL、评分和引言,并将这些信息存储到一个字典中,最后将所有电影的字典存储到一个列表中并返回。

        然后,我们定义了一个writeData(movieList)函数,它使用csv库的DictWriter类创建一个CSV写入对象,然后将电影信息列表逐行写入CSV文件。

        最后,在if __name__ == '__main__'语句块中,我们定义了一个空的电影信息列表movieList,然后循环遍历前10页豆瓣电影TOP250页面,分别抓取每一页的网页源码,并使用getEveryItem()函数解析出电影信息并存储到movieList中,最后使用writeData()函数将电影信息写入CSV文件。

        效果图:

        93a67053b142400d864a341e4a01a6f3.png

4c579a60ec81450391a989d29f54a32e.png

        源代码:

        

  1. 私信博主进入交流群,一起学习探讨,如果对CSDN周边以及有偿返现活动感兴趣:
  2. 可添加博主:Yan--yingjie
  3. 如果想免费获取图书,也可添加博主微信,每周免费送数十本
  4. #代码首先导入了需要使用的模块:requests、lxml和csv。
  5. import requests
  6. from lxml import etree
  7. import csv
  8. #
  9. doubanUrl = 'https://movie.douban.com/top250?start={}&filter='
  10. # 然后定义了豆瓣电影TOP250页面的URL地址,并实现了一个函数getSource(url)来获取网页的源码。该函数发送HTTP请求,添加了请求头信息以防止被网站识别为爬虫,并通过requests.get()方法获取网页源码。
  11. def getSource(url):
  12. # 反爬 填写headers请求头
  13. headers = {
  14. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
  15. }
  16. response = requests.get(url, headers=headers)
  17. # 防止出现乱码
  18. response.encoding = 'utf-8'
  19. # print(response.text)
  20. return response.text
  21. # 定义了一个函数getEveryItem(source)来解析每个电影的信息。首先,使用lxml库的etree模块将源码转换为HTML元素对象。然后,使用XPath表达式定位到包含电影信息的每个HTML元素。通过对每个元素进行XPath查询,提取出电影的标题、副标题、URL、评分和引言等信息。最后,将这些信息存储在一个字典中,并将所有电影的字典存储在一个列表中。
  22. def getEveryItem(source):
  23. html_element = etree.HTML(source)
  24. movieItemList = html_element.xpath('//div[@class="info"]')
  25. # 定义一个空的列表
  26. movieList = []
  27. for eachMoive in movieItemList:
  28. # 创建一个字典 像列表中存储数据[{电影一},{电影二}......]
  29. movieDict = {}
  30. title = eachMoive.xpath('div[@class="hd"]/a/span[@class="title"]/text()') # 标题
  31. otherTitle = eachMoive.xpath('div[@class="hd"]/a/span[@class="other"]/text()') # 副标题
  32. link = eachMoive.xpath('div[@class="hd"]/a/@href')[0] # url
  33. star = eachMoive.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0] # 评分
  34. quote = eachMoive.xpath('div[@class="bd"]/p[@class="quote"]/span/text()') # 引言(名句)
  35. if quote:
  36. quote = quote[0]
  37. else:
  38. quote = ''
  39. # 保存数据
  40. movieDict['title'] = ''.join(title + otherTitle)
  41. movieDict['url'] = link
  42. movieDict['star'] = star
  43. movieDict['quote'] = quote
  44. movieList.append(movieDict)
  45. print(movieList)
  46. return movieList
  47. # 保存数据
  48. def writeData(movieList):
  49. with open('douban.csv', 'w', encoding='utf-8', newline='') as f:
  50. writer = csv.DictWriter(f, fieldnames=['title', 'star', 'quote', 'url'])
  51. writer.writeheader() # 写入表头
  52. for each in movieList:
  53. writer.writerow(each)
  54. if __name__ == '__main__':
  55. movieList = []
  56. # 一共有10页
  57. for i in range(10):
  58. pageLink = doubanUrl.format(i * 25)
  59. source = getSource(pageLink)
  60. movieList += getEveryItem(source)
  61. writeData(movieList)

 

 

 

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜