超实用案例:Python简单实现网络爬虫

发表于:2023-2-06 09:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:xiaoyuer2815    来源:CSDN

  前言
  在这一篇博客中,我会用python来实现一个简单的网络爬虫。简单的爬取一下一些音乐网站、小说网站的标题、关键字还有摘要!所以这个爬虫并不是万能爬,只针对符合特定规则的网站使用。(只使用于爬标题、关键字和摘要的,所以只能爬在head标签中这三个信息都有的且meta标签中name参数在本文信息前面的网站。)希望大家看了这篇博客,能对大家学习爬虫有些帮助!(并不是很高深的爬虫,很基础!!!)
  要用到的知识
  要用到的知识都是比较简单的啦,基本上花点时间都能学会。
  首先就是python的基础语法啦,会用能看懂就好。(会有一些文件读取的操作)
  还有就是关于爬虫的一些知识了:贪婪匹配和惰性匹配。(re解析方式解析网页源代码)
  还需要一丢丢前端的知识:只需要大概看得懂html源代码就行。(知道是在干嘛的)
  这些就差不多了。(b站是最好的大学(主要是我懒,也没时间写这些))
  爬虫的具体实现
  先拿一个网站做例子分析,打开酷狗官网,右键点击检查:
  红框中的就是我们需要提取的信息啦。这还是很容易提取出来的。使用re模块里面的贪婪匹配与惰性匹配,将想要的数据提取出来就好。例如:
   obj = re.compile(r'<title.*?>(?P<title>.*?)</title>.*?'
                    r'<meta.*?name="keywords".*?content="(?P<keywords>.*?)".*?>'
                    r'<meta.*?name="description".*?content="(?P<description>.*?)".*?>', re.S)
  在上面我们只用了一次compile函数就完成了匹配。
  但是我,我们需要提取的并不止是酷狗官网,还有其他一些网站。上面代码写的规则并不适合一些网站,比如,一些网站把标题放在最后面,关键字和摘要放在前面,那么我们就匹配不到想要的信息。这个也比较好解决,将一条compile拆成多条compile就行。
      obj1 = re.compile(r'<title.*?>(?P<title>.*?)</title>', re.S)
      obj2 = re.compile(r'<meta.*?name="keywords".*?content="(?P<keywords>.*?)".*?>', re.S)
      obj3 = re.compile(r'<meta.*?name="description".*?content="(?P<description>.*?)".*?>', re.S)
  下面是整个python源代码(在源代码里面使用了文件读取将提取到的信息保存到文件里面):
  import requests
  import re
  import csv
   
  urls = []
   
  # 分别是酷狗音乐、酷我音乐、网易云音乐、起点中文网、咪咕音乐、bilibili、qq音乐
  urls.append("https://www.kugou.com/")
  urls.append("http://www.kuwo.cn/")
  urls.append("https://music.163.com/")
  urls.append("https://www.qidian.com/")
  urls.append("https://www.migu.cn/index.html")
  urls.append("https://www.bilibili.com/")
  urls.append("https://y.qq.com/")
   
  # 打开csv文件
  f = open("test.csv", mode="w", encoding="utf-8")
  csvwriter = csv.writer(f)
  csvwriter.writerow(["标题","关键字","摘要"])
   
  # 对所有网站进行get访问,获取源代码后用re模块将想要提取的内容提取出来
  for url in urls:
      # 向网页发出请求
      resp = requests.get(url)
      # 设置字符编码
      resp.encoding = 'utf-8'
      # 使用非贪婪匹配.*?(惰性匹配),re.S用来匹配换行符
      obj1 = re.compile(r'<title.*?>(?P<title>.*?)</title>', re.S)
      obj2 = re.compile(r'<meta.*?name="keywords".*?content="(?P<keywords>.*?)".*?>', re.S)
      obj3 = re.compile(r'<meta.*?name="description".*?content="(?P<description>.*?)".*?>', re.S)
      # 对网页源代码进行匹配
      result1 = obj1.finditer(resp.text)
      result2 = obj2.finditer(resp.text)
      result3 = obj3.finditer(resp.text)
      # 创建一个队列来将数据保存,方便写入csv文件中
      lis = []
      for it in result1:
          #print("标题:",it.group("title"))
          lis.append(it.group("title"))
      for it in result2:
          #print("关键字:",it.group("keywords"))
          lis.append(it.group("keywords"))
      for it in result3:
          #print("摘要:",it.group("description"))
          lis.append(it.group("description"))
      print(lis)
      print()
      # 将队列写入csv文件
      csvwriter.writerow(lis)
      # 关闭请求
      resp.close()
  print('over!')
  # 关闭文件指针
  f.close()
  下面是运行结果图:
  用WPS打开这个csv文件进行查看: 
  在pycharm中打开csv文件查看是否将数据写入文件中:
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号