一、数据解析

1、聚焦爬虫:爬取页面中指定的页面内容

  1. 指定url
  2. 发送请求
  3. 获得响应数据
  4. 数据解析
  5. 持久化存储解析后的·数据

    2、数据解析分类

  • 正则
  • bs4
  • xpath [重点]

    3、数据解析原理概述

  • 一般需要解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储


  • 进行指定标签的定位


  • 标签或者标签对应的属性中存储的数值进行提取(解析)


二、正则表达式完成数据解析

1、爬取糗事百科中的糗图

  1. import requests
  2. if __name__ == '__main__':
  3. # 如何爬取网页中的图片
  4. url = "https://pic.qiushibaike.com/system/pictures/12366/123668146/medium/T8V6MO4WYSVRSVEX.jpg"
  5. response = requests.get(url)
  6. # content属性返回的就是二进制形式的图片数据
  7. image_data = response.content
  8. """
  9. text 返回字符串
  10. json 返回json格式数据
  11. content 返回二进制形式的数据
  12. """
  13. # wb 以二进制的形式 写入到文件中
  14. with open("./qiutu.jpg", "wb") as fp:
  15. fp.write(image_data)

2、进阶版 先通过通用爬虫爬取整张页面的数据,通过聚焦爬虫 获得图片链接,再爬取图片

  1. <div class="thumb">
  2. <a href="/article/123839633" target="_blank">
  3. <img src="//pic.qiushibaike.com/system/pictures/12383/123839633/medium/G2B3PLMDBPU3APG1.jpg" alt="糗事#123839633" class="illustration" width="100%" height="auto">
  4. </a>
  5. </div>


观察源码发现,所有的图片都在一个又一个的class=”thumb”的div中

ex = '<div class="thumb">.*?<img src=(.*?)" alt.*?</div>'

如果正则作用到爬虫,那么findall() 方法第三个参数 必须是 re.S
re.findall(正则表达式,”字符串”,re.S)

  1. import requests
  2. import re
  3. import os
  4. if __name__ == '__main__':
  5. # 创建一个文件夹,用来保存所有的图片
  6. if not os.path.exists("./qiutuLibs"):
  7. os.mkdir("./qiutuLibs")
  8. # 设置一个通用的url模板,可以分页查询的
  9. for pageNum in range(1, 36):
  10. url = "https://www.qiushibaike.com/imgrank/page/%d" % pageNum
  11. headers = {
  12. "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)"
  13. " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
  14. }
  15. # 对页面进行第一次爬取
  16. response = requests.get(url, headers=headers)
  17. page_text = response.text
  18. # 通过正则表达式将img的src属性爬取出来
  19. ex = '<div class="thumb">.*?<img src=(.*?)" alt.*?</div>'
  20. # 通过正则匹配 将Img的src属性匹配出来
  21. imgSrc_list = re.findall(ex, page_text, re.S)
  22. # 进行二次爬取,将src属性作为地址 发送get请求
  23. i = 0
  24. for x in imgSrc_list:
  25. # 拼接出一个完整的图片地址 url
  26. x = "https:" + x
  27. x = x.replace("\"", "")
  28. print(x)
  29. # 对图片地址发起请求
  30. img_response = requests.get(url=x, headers=headers)
  31. # 拿到响应数据
  32. img_info = img_response.content
  33. # 文件名
  34. file_name = x.split('/')[-1]
  35. i += 1
  36. # 将文件存储到类路径下qiutuLibs下 wb是以二进制的方式写入
  37. with open("./qiutuLibs/"+file_name, "wb") as fl:
  38. fl.write(img_info)
  39. print("爬取完毕")

三、re模块 正则模块

  1. python内置模块


  1. 正则表达式本身就是匹配字符串的一种规则


  1. re模块的方法 | 方法 | 详情 | | —- | —- | | re.match() | 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回none. | | re.search() | 扫描整个字符串并返回第一个成功的匹配 | | re.compile() | 用于编译正则表达式,生成一个正则表达式(Pattern)对象 | | re.findall() | 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回一个空列表 |
  1. import re
  2. # 先将正则表达式编译为一个 正则表达式对象
  3. pa = re.compile("^go+gle$")
  4. str2 = "google"
  5. # 传入一个正则表达式对象,一个要匹配的字符串
  6. print(re.match(pa, str2))