S++

千线一眼

导航

python爬虫-正则解析

概述

Q: 什么是聚焦爬虫
A: 聚焦爬虫 (又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫。
Q:什么是数据解析
A: 简而言之就是在获取到的整张页面提取自己想要的元素。

数据解析分类

  • 正则
  • bs4
  • xpath(重点)

数据解析原理

  • 进行指定标签定位
  • 对标签或标签对应属性中存储的数据进行提取

实践

实践一:爬取一张图片

import requests
if __name__ == '__main__':
    # UA伪装
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) "
                      "Version/14.1 Safari/605.1.15 "
    }
    url = "https://w.wallhaven.cc/full/6o/wallhaven-6og386.jpg"
    # 获取图片的二进制数据
    img_data = requests.get(url=url,headers=headers).content
    # 将图片信息写进文件
    with open('../data2/do1_img1.jpg','wb') as  fp:
        fp.write(img_data)

实践二:正则爬取wallhaven多张图片

爬多了好像出错

import requests
import re
import os


# 判断页数输入是否合理
def judge_num(num1, num2):
    return 0 < num1 < num2


if __name__ == '__main__':
    # 标签选择相关
    word = ['latest', 'hot', 'toplist', 'random']
    print("0->latest\n1->hot\n2->toplist\n3->random")
    select = input("请输入你要爬取的标签:\n")
    while select not in ['0', '1', '2', '3']:
        print("输入不合格!!!\n")
        select = input("请输入你要爬取的标签:\n")
    tag = word[int(select)]
    base_url = 'https://wallhaven.cc/' + tag

    # 起始和结束页
    num1 = int(input("请输入你想爬取的起始页数:\n"))
    num2 = int(input("请输入你想爬取的结束页数:\n"))
    while not judge_num(num1, num2):
        print("输入不合格!!!\n")
        num1 = int(input("请重新输入你想爬取的起始页数:\n"))
        num2 = int(input("请重新输入你想爬取的结束页数:\n"))

    # 存放目录设置
    keyword = input("请输入关键词以方便创建文件夹:")
    if not os.path.exists('../data2/wallhaven'):  # 在D盘目录下创建一个名为wallpapers的文件夹
        os.mkdir('../data2/wallhaven')
    path = '../data2/wallhaven/' + keyword
    if not os.path.exists(path):  # 在wallpapers文件夹下创建一个以关键词命名的子文件夹以存放此次下载的所有壁纸
        os.mkdir(path)

    # UA伪装
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) "
                      "Version/14.1 Safari/605.1.15 "
    }
    img_src_list=[]
    for i in range(num1, num2):
        # 图片页面
        url = base_url + '?page=' + str(i)
        # 拿到当前页面数据
        page_data = requests.get(url=url, headers=headers).text
        # 使用聚焦爬虫对页面进行数据解析
        # 实际是解析img标签中的data-src和src属性(两者一样
        # 编写正则
        ex = ' data-src="(.*?)"'
        # 在page中使用正则获取图片url
        img_src_list += re.findall(ex, page_data, re.S)
    # 打印图片src
    print(img_src_list)
    # 存储图片信息
    img_num = 0
    for src in img_src_list:
        # 请求到图片数据
        img_data = requests.get(url=src,headers=headers).content
        # 生成图片名称(根据自己的喜好,也可以按url本来的命名方式命名
        img_num += 1
        img_name = keyword+str(img_num)+'.jpg'
        # 指定图片存放路径
        img_path = '../data2/wallhaven/'+keyword+'/'+img_name
        # 持久化存储
        with open(img_path,'wb') as fp:
            fp.write(img_data)
        print(img_name+",下载完成!")
    print("结束!!!")

结果

posted on 2022-03-06 16:43  S++  阅读(109)  评论(0)    收藏  举报