Python实战案例:采集P站数据内容

前言

嗨喽,大家好呀~这里是爱看美女的茜茜呐

开发环境:

  • Python 3.8 / 编译器

  • Pycharm 2021.2版本 / 编辑器

模块使用:

  • requests : 主要用来发 送 HTTP 请求 、 属于第三方模块

  • parsel : 解析html,xml内容,获取需要的数据 、属于第三方模块

  • re :python独有的匹配字符串的模块 、内置模块,无需安装

  • json :该模块就可以完成 JSON 与 Python 两种数据格式的相互转换 、内置模块,无需安装

第三方模块安装:

在cmd里面或者pycharm终端里面进行安装 pip install requests 安装。

本次目标

Python实战案例:采集P站数据内容_第1张图片

本次案例的思路流程:

一. 关于数据来源查询:

找不到数据来源,不知道去采集 ?

采集 P站数据内容 主要是图片壁纸

  1. 找单张图片url地址

  2. 找这个图片url地址来源

    来自于图片详情页url:

  3. 找多张图片url地址参数变化

    在图片列表页可以获取每个图片详情页url地址

二. 代码实现思路:

  1. 发送请求:

  2. 获取数据

  3. 解析数据

  4. 保存数据

代码展示:

导入模块

import requests 
import parsel
import re
import json
import pprint 
def change_title(title):
    mode = re.compile(r'[\\\/\:\*\?\"\<\>\|]')
    new_title = re.sub(mode, '_', title)
    return new_title

多页采集

for page in range(1, 11):
    print(f'======================正在爬取第{page}页数据内容======================')
    url = f'*****/hot_{page}'

发送请求

需要加上headers 请求头

请求头: 把Python代码伪装成浏览器向服务器发送请求

user-agent:浏览器的信息

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

模拟浏览器对服务器发送请求, 然后服务器就给我们返回一个响应数据 response

    response = requests.get(url=url, headers=headers)
    # response.text 获取网页的文本数据
    # print(response.text)

解析数据

css选择 xpath re正则表达式 bs4 parsel

首先需要把 response.text 这个网页字符串 转换成 selector 对象

    selector = parsel.selector(response.text)

css选择器 就是根据标签属性内容提取相关数据

标签里面的class类 开头用一个圆点 . 可以代替

attr() 属性选择器 选择标签里面什么属性内容 text 取标签的文本数据

getall() 取所有标签内容 返回的是一个列表

    href = selector.css('.px-img a::attr(href)').getall()
    titles = selector.css('.px-info .px-info-title::text').getall()

我要提取一个列表每一个元素 是通过遍历

zip() 一个合并函数 可以把两个列表合并到一起 返回的一个zip对象

通过遍历zip对象 给我们返回的一个元组

    zip_data = zip(href, titles)
    # print(zip_data)
    for index in zip_data:
        index_url = '****' + index[0]

        title = index[1]
        response_1 = requests.get(url=index_url, headers=headers)
        # print(index_url)
        # print(response_1.text)
        # re.findall('写匹配规则', '在哪里匹配')
        # \ 转义字符 主要把哪些特殊字符 转义成除了自己本身字符意思 不含有其他任何特殊意思
        # 正则表达式 匹配出来的内容 是列表
        html_data = re.findall('window\.__INITIAL_STATE__=(.*?)', response_1.text)
        json_data = json.loads(html_data)

json字典取值 键值对取值, 根据冒号左边的关键字 提取冒号右边的值

        img_data = json_data['tag']['worksDetailData']['coverImage']['path']
        img_url = '*****' + img_data + '?imageView2/3/q/85/interlace/1/w/2560/h/2560/format/webp'

split() 字符串分割 以 ‘.’ 分割成一个列表

        img_name = img_data.split('.')[-1]

保存数据

        # print(img_url)
        # print(title)
        # print(type(json_data))
        # break # 跳出循环 只打印一个就好了
        # response.content 获取网页二进制数据 图片/视频/音频/特殊格式的文件 这些都是需要获取二进制数据
        new_title = change_title(title)
        img_content = requests.get(url=img_url, headers=headers)
        with open('img\\' + new_title + '.' + img_name, mode='wb') as f:
            f.write(img_content)
            print(title)

Python实战案例:采集P站数据内容_第2张图片
Python实战案例:采集P站数据内容_第3张图片

Python实战案例:采集P站数据内容_第4张图片

Python实战案例:采集P站数据内容_第5张图片
Python实战案例:采集P站数据内容_第6张图片
Python实战案例:采集P站数据内容_第7张图片

尾语

大家觉得有用的话可以来个免费的点赞+收藏+关注,

防止下次我悄悄更新了好东西你却不知道 !!!

感谢你观看我的文章呐~本次航班到这里就结束啦

希望本篇文章有对你带来帮助 ,有学习到一点知识~

躲起来的星星也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~更多源码、资料、素材、解答、交流皆点击下方名片获取呀

你可能感兴趣的:(python爬虫,python,开发语言,pycharm)