python学习第4篇

我又来了,今天开启聚焦爬虫

  1. 什么是聚焦爬虫?
    聚焦爬虫是用来爬取页面特定局部信息的

  2. 聚焦爬虫与通用爬虫的区别与联系?
    聚焦爬虫用来爬取页面特定局部信息
    通用爬虫是用来爬取页面的一整面信息
    先爬一整面,再爬局部,爬取页面中指定的页面内容

  3. 聚焦爬虫如何使用?
    -编码流程:
    -1.指定URL
    -2.发起请求
    -3.获取响应数据
    -4.数据解析
    -5.持久化存储

    -三种解析方式:
    -1.正则表达式
    -2.bs4
    -3.xpath(最常用

  4. 数据解析原理:
    解析的局部文本内容都会在标签之间或标签对应的属性中存储。
    -1.进行指定标签定位
    -2.标签或者标签对应属性中存储的数据值进行提取(解析)

first.正则解析

这里用正则解析方法爬取糗事百科网站上的图片,网址(URL):https://www.qiushibaike.com/imgrank/

首先打开页面的抓包工具,找到我们需要的UA(进行UA伪装🥸

接着,我们需要用正则表达式获取图片的地址,也就是我们进行的聚焦爬虫
查看elements,找到id=content,class=main在这里插入图片描述

在找到图片所在的class在这里插入图片描述

<div class="thumb">
    <a href="/article/124058316" target="_blank">
    <img src="//pic.qiushibaike.com/system/pictures/12405/124058316/medium/EPNASXE1ZB8VEBTB.jpg" alt="糗事#124058316" class="illustration" width="100%" height="auto">
    </a>
    </div>
用正则表达式提取图片地址,下面是一步步的获取过程:
1.ex = '<div class="thumb">.*?</div>'这里是正则表达式的非贪婪模式
2.ex = '<div class="thumb">.*?<img src="(.*?) alt.*?</div>'

这里需要注意的是正则表达式的贪婪和非贪婪模式对格式的要求非常严格,这里.jpg"和alt之间有一个空格,如果忘记打上结果就不对了。还有(.*?)的位置也很重要,因为()中的内容会作为捕获组的匹配结果
我们可以先写一个简单的小程序运行一下,把得到的图片地址打印出来。
import re
import requests
if __name__ == "__main__":
    headers = {
        'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
    }
    url = 'https://www.qiushibaike.com/imgrank/'
    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)
    print(img_src_list)

测试一下,打印出来的应该是这样
//pic.qiushibaike.com/system/pictures/12405/124058316/medium/EPNASXE1ZB8VEBTB.jpg
(其中一个
这样 我们就完成了对这个页面上的图片的解析提取

下一步,我们需要做的是拼接出完整的图片URL,请求图片数据,给图片命名,最后进行储存就OK啦

这里进行拼接的话,一页上有很多图片,我们不可能一个一个拼接,所以这里需要用for来进行循环,让他来帮助我们完成拼接、请求数据和命名工作。(所以这里觉得循环真的是个好东西,把那些重复性高的工作帮我们很快解决了!

        for src in img_src_list:
            src = 'https:'+src
            #拼接完整的图片url
            img_data = requests.get(url=src,headers=headers).content
            #请求到图片的二进制数据
            img_name = src.split('/')[-1]
            #生成图片名称 从原始地址中获取
            img_path = './qiutulibs/'+img_name
            with open(img_path,'wb')as fp:
                fp.write(img_data)
                print(img_name,'下载成功!')

这里需要注意的是,由于我们想得到的是图片数据,所以发起请求时的URL不再是原先的URL了,而是我们新生成的图片的地址,也就是src

然后我们拓展一下,加入分页功能,也就是获取多页的图片,通过观察,我们发现第一页第二页第三页甚至第n页的差别:https://www.qiushibaike.com/imgrank/page/1/
是URL的page属性发生了改变
我们通过加入一个URL模版来实现
完整代码:

import requests
import re
import os
#创建文件夹保存图片
if __name__ == '__main__':
    if not os.path.exists('./qiutulibs'):
        os.mkdir('qiutulibs')
    #设置一个通用的url模版
    headers = {
        'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
    }
    url = 'https://www.qiushibaike.com/imgrank/page/%d/'
    #pagenum = 2
    for pagenum in range(1,3):
        new_url = format(url%pagenum)
        #更新页码



        #先使用通用爬虫爬取
        page_text = requests.get(url=new_url, headers=headers).text


        #聚焦爬虫将页面中图片进行解析提取
        #提取每个照片的属性值
        ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
        img_src_list = re.findall(ex,page_text,re.S)
        #返回列表
        #re.S单行匹配
        #print(img_src_list)
        for src in img_src_list:
            src = 'https:'+src
            #拼接完整的图片url
            img_data = requests.get(url=src,headers=headers).content
            #请求到图片的二进制数据
            img_name = src.split('/')[-1]
            #生成图片名称 从原始地址中获取
            img_path = './qiutulibs/'+img_name
            with open(img_path,'wb')as fp:
                fp.write(img_data)
                print(img_name,'下载成功!')

ps:这里记一个知识点
在发起请求时:
.content返回二进制形式的图片数据
.text返回字符串
.json返回对象形式

因为出去玩了,bs4和xpath的视频还没看完,呜呜呜,明天加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值