前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫实例十一:python爬虫带你玩转日系P站

爬虫实例十一:python爬虫带你玩转日系P站

原创
作者头像
远方的星
修改2021-03-21 18:30:00
1.1K0
修改2021-03-21 18:30:00
举报

一、页面分析

今天就说一些开场白了,直接进入主题。

首先,打开目标网址:网址传送门 (未成年人禁止入内嗷(手动滑稽))

结构和贴吧差不多呀,肯定要分两步。

第一步:通过主详情页,拿到各个子详情页的链接。

右击 页面进行检查,发现了每个子页面对应的article节点,点开一个article节点进行观察,很容易发现,里面有一个跳转链接。

目标一,get!

第二步,拿到每个图片的下载链接。 右击检查,也很容易发现,它们的下载链接,但同时也发现了,“干扰项”

在获取链接的时候,首先要找到p节点,但是,p节点存在同名的干扰项,这时候就需要使用一些手法进行处理了。具体看代码。

二、完整代码

代码语言:python
复制
# -*- coding: UTF-8 -*-
"""
@Author  :远方的星
@Time   : 2021/3/20 7:44
@CSDN    :https://blog.csdn.net/qq_44921056
@腾讯云   : https://cloud.tencent.com/developer/column/91164
"""
from fake_useragent import UserAgent
import requests
from lxml import etree
import bs4
import os
# 创建一个文件夹来报预保存图片
if not os.path.exists('D:/Animex动漫社'):
    os.mkdir('D:/Animex动漫社')
# 创建随机请求头
ua = UserAgent(verify_ssl=False, path='fake_useragent.json')
# 用户输入爬取的页数
page = input('请输入想要爬取的页数')
page = int(page) + 1
# 使用for循环进行多页爬取
for i in range(1, page):
    url = 'http://www.animetox.com/category/pic/pixiv/page/{}'.format(i)
    # 获取页面内容
    response_1 = requests.get(url).text
    html = etree.HTML(response_1)
    image_urls = html.xpath('//*[@id="main-contents"]/section[2]/div/div/article')  # 找到各个article节点
    for j in range(len(image_urls)):
        # 提取每一组的图片的访问链接
        image_url = image_urls[j].xpath('./a/@href')[0]
        # 获取页面内容
        response_2 = requests.get(image_url).text
        html = response_2
        soup = bs4.BeautifulSoup(html, 'html.parser')
        # 获取指定的节点,排除掉p节点的干扰项
        image_src_s = soup.select('.cps-post-main-box div p[style="text-align: center;"]')
        # 定义num方便图片命名
        num = 1
        for k in range(len(image_src_s)):
            # 获取指定节点下的节点
            image_src = image_src_s[k].select('img')
            # 即使排除了干扰项,但可能存在满足条件,但内容为空的情况,于是使用条件循环进行筛选
            if image_src == []:
                continue
            else:
                image_src = image_src[0]
            # 获取图片链接
            image_src = image_src.get('data-lazy-src')
            # 得到图片内容
            image_data = requests.get(image_src).content
            # 图片名字
            image_name = '{}_{}_{}.jpg'.format(i, j+1, num)
            # 图片保存小路径名字
            path_name = '{}_{}'.format(i, j+1)
            # 大路径名字
            path = 'D:/Animex动漫社/' + path_name
            if not os.path.exists(path):
                os.mkdir(path)
            # 图片的保存路径
            image_path = path + '/' + image_name
            num += 1
            # 保存文件
            with open(image_path, 'wb') as f:
                f.write(image_data)
                print(image_name, '下载成功!')
                f.close()

三、结果展示

图片名字含义:num1_num2_num3分别代表,主页面第几页_页面中第几个子页面_子页面中第几张图片。

学废了咩,还不赶紧尝试尝试!

作者:远方的星

CSDN:https://blog.csdn.net/qq_44921056

腾讯云:https://cloud.tencent.com/developer/column/91164

本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、页面分析
  • 二、完整代码
  • 三、结果展示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档