Python爬虫之数据解析/提取(二)

本文深入探讨Python爬虫中的数据解析,包括正则re、bs4库和xpath方法。介绍了爬取糗事百科图片、58同城房源、4k图片、全国城市名称以及免费模板下载等实战案例,详细讲解了各种解析技术的使用和解析原理。
摘要由CSDN通过智能技术生成


前言

  • 爬虫在使用场景中的分类
  • 通用爬虫
    抓取系统重要组成部分。抓取的是一整张页面数据
  • 聚焦爬虫
    是建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容
  • 增量式爬虫
    检测网站中数据更新的情况。只会抓取网站中最新更新出来的数据。

数据分析分类

  • 正则
  • bs4
  • xpath

数据解析原理概述

  • 聚焦爬虫

编码流程

  • 指定url
  • 发起请求
  • 获取响应数据
  • 数据解析
  • 持久化存储
  • 原理概述概述
  • 解析的局部文本内容都会再标签之间或者标签对应的属性中进行存储
  1. 进行指定标签定位
  2. 标签或者标签对应的属性中存储的数据值进行提取(解析)

一、正则re进行数据解析

1.1 爬取糗事百科中糗图板块下所有的糗图图片⭐

在这里插入图片描述

  1. 需求分析

先使用通用爬虫获取一整张页面,再使用聚焦爬虫获取图片内容

在这里插入图片描述
在这里插入图片描述

  • 具体分析
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

拷贝最小的局部源码:

  • 目的:提取div中的img标签中的src属性值提取出来
<div class="thumb">

<a href="/article/124250612" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12425/124250612/medium/JRYLE3WRJZXI8KYH.jpg" alt="糗事#124250612" class="illustration" width="100%" height="auto">
</a>
</div>
  • 编写正则
ex = '<div class="thumb">.*?<img src="(.*?) alt.*?</div>'
# ()括号内容是我们想要的
  1. 代码编写

处理第一页数据:

  • 获取图片路径并存储到列表
import requests
import re

if __name__ == '__main__':

    url = 'https://www.qiushibaike.com/imgrank/'

    headers = {
   
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
    }

    # 使用通用爬虫对url对应的一整张页面进行爬取
    # 一整张页面数据使用.text 进行获取
    page_text = requests.get(url=url, headers=headers).text

    # 使用聚焦爬虫将页面中所有的糗图进行解析/提取
    ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
    # 返回列表
    img_src_list = re.findall(ex,page_text,re.S)# re.S 叫做单行匹配  re.M 叫做多行匹配
    print(img_src_list)
['//pic.qiushibaike.com/system/pictures/12424/124248898/medium/9EBHN0P7Z704IRNA.jpg', '//pic.qiushibaike.com/system/pictures/12425/124250569/medium/IYVWM19GECVE35N6.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251068/medium/T42KZBCK2BODVH9N.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251038/medium/R1C15IV0JA3O5GK7.jpg', '//pic.qiushibaike.com/system/pictures/12423/124237042/medium/B7C6RN8FG1ECU4QO.jpg', '//pic.qiushibaike.com/system/pictures/12425/124250034/medium/70UZCFWLI4PL3937.jpg', '//pic.qiushibaike.com/system/pictures/12414/124148138/medium/IBZA9V3283IO5809.jpg', '//pic.qiushibaike.com/system/pictures/12423/124238731/medium/936HVUV7OOMN9L4P.jpg', '//pic.qiushibaike.com/system/pictures/12424/124241238/medium/WKQS193J9BDN9MEW.jpg', '//pic.qiushibaike.com/system/pictures/12424/124241248/medium/NP2I6R4SYNPQG3H9.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251192/medium/HMIK71X9R6RZFNY1.jpg', '//pic.qiushibaike.com/system/pictures/12425/124250567/medium/EQWD2NB6B1TUFD21.jpg', '//pic.qiushibaike.com/system/pictures/12423/124239461/medium/I1MFATNSTI7XQP6V.jpg', '//pic.qiushibaike.com/system/pictures/12423/124238410/medium/YG8Z33RG54KR7OC2.jpg', '//pic.qiushibaike.com/system/pictures/12423/124236773/medium/JAPN635V0G2V2BLA.jpg', '//pic.qiushibaike.com/system/pictures/12423/124235383/medium/JI0L091QQVS7PQHO.jpg', '//pic.qiushibaike.com/system/pictures/12424/124247459/medium/EAEV8Z68C99FU12L.jpg', '//pic.qiushibaike.com/system/pictures/12423/124239804/medium/11DVRSZJQ78HNT8D.jpg', '//pic.qiushibaike.com/system/pictures/12425/124250516/medium/ZEKVE91EMMMJ3JTB.jpg', '//pic.qiushibaike.com/system/pictures/12423/124237782/medium/S0O4E74O52K5YZW3.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251193/medium/VEP5BC2ZKRHYYOOT.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251161/medium/3SXGPJXG5C13JBAU.jpg', '//pic.qiushibaike.com/system/pictures/12425/124250224/medium/MZQF7KXXBDHMUS13.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251222/medium/TOT961UBURC8WKTA.jpg', '//pic.qiushibaike.com/system/pictures/12423/124239840/medium/0MHKXBDTU7XLMCYW.jpg']

通过分析上图列表中路径发现少了些许东西:
https://pic.qiushibaike.com/system/pictures/12425/124250612/medium/JRYLE3WRJZXI8KYH.jpg

  • 修改后下载到指定文件夹
# 需求:爬取糗事百科中糗图板块下所有的糗图图片

import requests
import re
import os

if __name__ == '__main__':

    # 创建一个文件见  用来保存所有的图片
    if not os.path.exists('./qiutuLibs'):
        os.makedirs('./qiutuLibs')

    url = 'https://www.qiushibaike.com/imgrank/'

    headers = {
   
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
    }

    # 使用通用爬虫对url对应的一整张页面进行爬取
    # 一整张页面数据使用.text 进行获取
    page_text = requests.get(url=url, headers=headers).text

    # 使用聚焦爬虫将页面中所有的糗图进行解析/提取
    ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
    # 返回列表
    # findall()方法的使用见总结①
    img_src_list = re.findall(ex,page_text,re.S)# re.S 叫做单行匹配  re.M 叫做多行匹配
    print(img_src_list)

    # 单独便利列表 并做get请求
    for src in img_src_list:
        # 拼接出完整的图片地址
        src = 'https:' + src
        # 发起get请求  获取二进制图片数据
        img_data = requests.get(url=src,headers=headers).content
        # 生成图片名称  从原始切分出来
        # '//pic.qiushibaike.com/system/pictures/12417/124176031/medium/VC2AHAHUEUUX1KY3.jpg"'
        img_name = src.split('/')[-1] # 最后一个
        # 图片存储路径
        imgPath = './qiutuLibs/' + img_name
        with open(imgPath,'wb') as fp:
            fp.write(img_data)
            print(img_name,'下载成功')

在这里插入图片描述
在这里插入图片描述

处理第多页数据:
第一页:https://www.qiushibaike.com/imgrank/
(其实我们用这个url也是该页面:https://www.qiushibaike.com/imgrank/page/1/)
第二页:https://www.qiushibaike.com/imgrank/page/2/
第二页:https://www.qiushibaike.com/imgrank/page/3/

# 需求:爬取糗事百科中糗图板块下所有的糗图图片

import requests
import re
import os

if __name__ == '__main__':
    headers = {
   
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
    <
  • 13
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胜天半月子

打不打商的无所谓,能帮到你就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值