51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 605|回复: 0
打印 上一主题 下一主题

[python] Python简单实现网络爬虫实用案例

[复制链接]
  • TA的每日心情
    无聊
    1 分钟前
  • 签到天数: 945 天

    连续签到: 4 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-2-6 15:03:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前言
      在这一篇博客中,我会用python来实现一个简单的网络爬虫。简单的爬取一下一些音乐网站、小说网站的标题、关键字还有摘要!所以这个爬虫并不是万能爬,只针对符合特定规则的网站使用。(只使用于爬标题、关键字和摘要的,所以只能爬在head标签中这三个信息都有的且meta标签中name参数在本文信息前面的网站。)希望大家看了这篇博客,能对大家学习爬虫有些帮助!(并不是很高深的爬虫,很基础!!!)
      要用到的知识
      要用到的知识都是比较简单的啦,基本上花点时间都能学会。
      首先就是python的基础语法啦,会用能看懂就好。(会有一些文件读取的操作)
      还有就是关于爬虫的一些知识了:贪婪匹配和惰性匹配。(re解析方式解析网页源代码)
      还需要一丢丢前端的知识:只需要大概看得懂html源代码就行。(知道是在干嘛的)
      这些就差不多了。(b站是最好的大学(主要是我懒,也没时间写这些))
      爬虫的具体实现
      先拿一个网站做例子分析,打开酷狗官网,右键点击检查:

      红框中的就是我们需要提取的信息啦。这还是很容易提取出来的。使用re模块里面的贪婪匹配与惰性匹配,将想要的数据提取出来就好。例如:
    1. obj = re.compile(r'<title.*?>(?P<title>.*?)</title>.*?'
    2.                     r'<meta.*?name="keywords".*?content="(?P<keywords>.*?)".*?>'
    3.                     r'<meta.*?name="description".*?content="(?P<description>.*?)".*?>', re.S)
    复制代码


    在上面我们只用了一次compile函数就完成了匹配。
      但是我,我们需要提取的并不止是酷狗官网,还有其他一些网站。上面代码写的规则并不适合一些网站,比如,一些网站把标题放在最后面,关键字和摘要放在前面,那么我们就匹配不到想要的信息。这个也比较好解决,将一条compile拆成多条compile就行。
    1. obj1 = re.compile(r'<title.*?>(?P<title>.*?)</title>', re.S)
    2.       obj2 = re.compile(r'<meta.*?name="keywords".*?content="(?P<keywords>.*?)".*?>', re.S)
    3.       obj3 = re.compile(r'<meta.*?name="description".*?content="(?P<description>.*?)".*?>', re.S)
    复制代码


    下面是整个python源代码(在源代码里面使用了文件读取将提取到的信息保存到文件里面):
    1. import requests
    2.   import re
    3.   import csv
    4.   
    5.   urls = []
    6.   
    7.   # 分别是酷狗音乐、酷我音乐、网易云音乐、起点中文网、咪咕音乐、bilibili、qq音乐
    8.   urls.append("https://www.kugou.com/")
    9.   urls.append("http://www.kuwo.cn/")
    10.   urls.append("https://music.163.com/")
    11.   urls.append("https://www.qidian.com/")
    12.   urls.append("https://www.migu.cn/index.html")
    13.   urls.append("https://www.bilibili.com/")
    14.   urls.append("https://y.qq.com/")
    15.   
    16.   # 打开csv文件
    17.   f = open("test.csv", mode="w", encoding="utf-8")
    18.   csvwriter = csv.writer(f)
    19.   csvwriter.writerow(["标题","关键字","摘要"])
    20.   
    21.   # 对所有网站进行get访问,获取源代码后用re模块将想要提取的内容提取出来
    22.   for url in urls:
    23.       # 向网页发出请求
    24.       resp = requests.get(url)
    25.       # 设置字符编码
    26.       resp.encoding = 'utf-8'
    27.       # 使用非贪婪匹配.*?(惰性匹配),re.S用来匹配换行符
    28.       obj1 = re.compile(r'<title.*?>(?P<title>.*?)</title>', re.S)
    29.       obj2 = re.compile(r'<meta.*?name="keywords".*?content="(?P<keywords>.*?)".*?>', re.S)
    30.       obj3 = re.compile(r'<meta.*?name="description".*?content="(?P<description>.*?)".*?>', re.S)
    31.       # 对网页源代码进行匹配
    32.       result1 = obj1.finditer(resp.text)
    33.       result2 = obj2.finditer(resp.text)
    34.       result3 = obj3.finditer(resp.text)
    35.       # 创建一个队列来将数据保存,方便写入csv文件中
    36.       lis = []
    37.       for it in result1:
    38.           #print("标题:",it.group("title"))
    39.           lis.append(it.group("title"))
    40.       for it in result2:
    41.           #print("关键字:",it.group("keywords"))
    42.           lis.append(it.group("keywords"))
    43.       for it in result3:
    44.           #print("摘要:",it.group("description"))
    45.           lis.append(it.group("description"))
    46.       print(lis)
    47.       print()
    48.       # 将队列写入csv文件
    49.       csvwriter.writerow(lis)
    50.       # 关闭请求
    51.       resp.close()
    52.   print('over!')
    53.   # 关闭文件指针
    54.   f.close()
    复制代码


    下面是运行结果图:

      用WPS打开这个csv文件进行查看:

      在pycharm中打开csv文件查看是否将数据写入文件中:




    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-9 09:06 , Processed in 0.064671 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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