Python爬虫之女神网图片(三)

Python爬虫之女神网图片(三)女神网是一个可以搜索女神的图片的网站。废话不说,直接来干货:环境配置:系统环境:WIN7/8/10编译环境:Python3+所需库:requests、re、os、pymongo、Beatifulsoup、timeIDE:Pycharmnvshen.py#!/usr/bin/python#-*-coding:utf-8-*-importrequestsfromrequestsi…

大家好,又见面了,我是你们的朋友全栈君。

女神网是一个可以搜索女神的图片的网站。

Python爬虫之女神网图片(三)


废话不说,直接来干货:

环境配置:

  1. 系统环境:WIN7/8/10
  2. 编译环境:Python3+
  3. 所需库:requests、re、os、pymongo、Beatifulsoup、time
  4. IDE:Pycharm

nvshen.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import requests
from requests import RequestException
from bs4 import BeautifulSoup
import re
from multiprocessing import Pool


# import pymongo

# from config import *
import os
import time

start=24656#起始图片ID,打开任何一个图集,链接最后的那一串数字,五位数。
end=25370#终止图片ID,起始初始建议间隔大一些,然后然他自动遍历搜索有效地址

# MONGO_URL = 'localhost'#建立数据库基本参数,并且连接本地MONGODB数据库。
# MONGO_DB = 'nvshens'
# MONGO_TABLE = 'piture'
# client = pymongo.MongoClient(MONGO_URL,connect=False)#声明MONGODB数据库对象,connect=False是为了消除MONGODB有关多线程的提示
# db=client[MONGO_DB]#数据库名称

base_url='https://www.nvshens.com/g/'#宅男女神美图图片专栏下的基本网址

headers1={
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding":"gzip, deflate, sdch, br",
"Accept-Language":"zh-CN,zh;q=0.8",
"Cache-Control":"max-age=0",
"Connection":"keep-alive",
"Cookie":"records=%5B%7B%22id%22%3A%2225542%22%2C%22name%22%3A%22%u97E9%u96E8%u5A75%22%7D%5D; gallery_25364=1; Hm_lvt_1bb490b9b92efa278bd96f00d3d8ebb4=1517657472; Hm_lpvt_1bb490b9b92efa278bd96f00d3d8ebb4=1517658032; Hm_lvt_f378865b660846b55ba91d29e1c4c04d=1517657803; Hm_lpvt_f378865b660846b55ba91d29e1c4c04d=1517658776; gallery_24656=1",
"Host":"www.nvshens.com",
"If-Modified-Since":"Sat, 03 Feb 2018 11:19:10 GMT",
"Upgrade-Insecure-Requests":"1",
"User-Agent":"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4295.400 QQBrowser/9.7.12661.400",
}
headers2={
'Accept':'image/webp,image/*,*/*;q=0.8',
'Accept-Encoding':'gzip, deflate, sdch, br',
'Accept-Language':'zh-CN,zh;q=0.8',
'Cache-Control':'max-age=0',
'Connection':'keep-alive',
'Host':'t1.onvshen.com:85',
"If-None-Match":"ce118ca4a39cd31:0",
"Referer":"https://www.nvshens.com/g/26099/",
'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4295.400 QQBrowser/9.7.12661.400',

         }

def tes2_url(url):
    print('正在访问',url)
    try:#确保每一个requests都有异常处理
        response = requests.get(url, headers=headers1,timeout=5)
        soup = BeautifulSoup(response.text, 'lxml')
        if soup.select('#htilte'):#是否有标题,判断该页面下是否有图片集
            url_true=url
            return url_true
        else:
            print('无效地址',url)
            pass
    except:
        pass

def url_jiexi(url_true):
    response = requests.get(url_true, headers=headers1)
    soup = BeautifulSoup(response.text, 'lxml')
    try:
        title = soup.select_one('#htilte').text
        imag_num = int(re.sub("\D", "", soup.select_one('#dinfo > span').text[:3]))#正则表达式获得具体数字
        imag_base = soup.img['src'][:-5]#获得src标签值,并且去掉src=这几个字符
        print(title)
        print(imag_num)
        print(imag_base)
        return (title,imag_num,imag_base)
    except:
        return None
def download_image(title,imag_base,i):
    imag_url=imag_base+str(i).zfill(3)+".jpg"
    print('正在下载',imag_url)#!!很重要,获得一个调制信息
    try:
        response = requests.get(imag_url, headers=headers2,timeout=10)
        print(response.status_code)
        if response.status_code == 200:
            print("请求图片成功")
            save_image(response.content, title, i)
        else:
            pass
        return None
    except RequestException:
        print('请求图片出错',imag_url)
        return None

def save_image(content,title,i):#创建对应分类的文件夹,并且保存图片。
    dir_name_or=str(title)[:100].strip()
    dir_name = re.sub("[\s+\.\!\/]+", "",dir_name_or)
    print(dir_name)
    dir_path='E:\BIG_DATA\PICS\{}'.format(dir_name)
    try:
        os.mkdir(dir_path)
        print("创建文件夹成功")
    except:
        pass

    file_path='{0}\{1}.{2}'.format(dir_path,str(i).zfill(3),'jpg')
    if not os.path.exists(file_path):
        with open(file_path,'wb') as f:
            f.write(content)
            f.close()
        print("写入图片成功")

# def save_to_mongo(result):
#     try:
#         if db[MONGO_TABLE].insert(result):
#             print('存储到MONGODB成功',result)
#             return True
#         return False
#     except:
#         print('存储错误')

def main(i):
        url=base_url+str(i)
        url_true=tes2_url(url)
        if url_true:
            title, imag_num,imag_base =url_jiexi(url_true)
            for i in range(1, int(imag_num)):
                download_image(title,imag_base,i)
                imag_url = imag_base + str(i).zfill(3) + ".jpg"
                result={
                    "title":title,
                    "indx":i,
                    "url":imag_url
                }
                print(result)

if __name__ == '__main__':
    pool=Pool()
    pool.map(main,[i for i in range(start,end)])

分析网站:(最重要一部分!)

作为一个爬虫新手,分析网站思路的学习是我之前学习过程中花费时间精力最大的部分。这次要爬取的网站来自于百度搜索,宅男女神的第一个结果网站。首先打开F12,观察界面中各个图集的入口信息,发现href标签中带有信息/g/24699/,而后面这个五位数是决定图集不同的主要因素。而且,越是最新的图片,数字越大。网站是通过时间差异来给图集编号,那么只要我遍历所有编号,就能获得所有图片集地址信息了。通过手动测试发现,按顺序编号,不一定存在图集,所有需要一个函数来筛选出有效的详情图片集网址。

获得详情页地址以后,分析详情页。我们需要抓取,详情页中的标题,图片地址,图片个数。观察图片地址发现, https://t1.onvshen.com:85/gallery/25253/24581/s/030.jpg ,图片的来源格式类似于上面这个链接,同个图集下,除了结尾的三位数030不会改变,其他地方不变。通过获得图片集图片个数,确定有效图片范围,再通过获得图片集地址的固定要素,构造图片集内所有图片的获得链接。

获得图片链接后,只需要保存访问图片链接的response.content,即可实现图片下载保存。通过os库进行文件夹创建,分类保存。再设置格式,保存至MONGODB数据库

具体一分析,是不是发现挺简单的!虽然,在崔大视频里面很多爬虫的网站都带有一些难度,比如动态网站,今日头条,里面的图片链接信息就会比较隐蔽,需要多多发现才能找到。但是,这次的这个网站爬取难度还是非常低的,只需要思路清楚,接下来就是自己实现过程中的各种小问题的解决,多查百度,就能搞定了。

这个爬虫思路还有改善空间,比如说有效图片地址,可以单独设置一个py文件,去运行,保存的地址都是有效地址,就无需自己从10000遍历到30000这么多了。提取以后,遍历有效地址列表就好了。因为爬取量比较大,还可以加上多线程,加快运行速度。

最后祝大家开心顺利!

Python爬虫之女神网图片(三)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/133548.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • springboot事务的传播机制[通俗易懂]

    springboot事务的传播机制[通俗易懂]事务的传播机制所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。(,默认)REQUIRED :如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。SUPPORTS :如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。MANDATORY :如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。REQUIRES_NEW :创建一个新的事务,如果当前存在事务,则把当前事务挂起。

  • Vue上传文件操作(没有CV,认真看)

    Vue上传文件操作(没有CV,认真看)项目场景: 通过vue上传文件基本操作问题描述:使用html上传文件时,很容易理解,那么vue文件上传呢?我们学了vue不可能还往里面写原生html的内容吧!先放代码再解释:<template><div><el-form:model=”form”><el-uploadaction=”url”:auto-upload=”false”:on-change=”onchanger”:fil

    2022年10月10日
  • Delphi 2007安装问题[通俗易懂]

    Delphi 2007安装问题[通俗易懂]
    安装前提是你已经下载了Delphi2007forWin32的ISO。
      Delphi2007安装程序根据不同的序列号(许可文件)来判断安装版本,一般ISO中自带的许可文件是专业版的。
      企业版和专业版的许可文件下载:delphi2007_slip.zip
      C++Builder2007的企业版许可文件(slipfileforC++Builder2007):cb2007_ent.zip
      新装方法:
      1、下载D2

  • (4.31)quotename函数

    (4.31)quotename函数操作sqlserver尤其是写存储过程时,要用到各种各样的函数,今天就总结一个quotename()的用法。1.语法:quotename(‘character_string’[,‘quote_character’])[]里面的内容说明可以省略,缺省情况下,说明用‘[]’引用。character_string,unicode字符数据构成的字符串。character_string是s…

  • 利用Pycharm连接服务器[通俗易懂]

    利用Pycharm连接服务器[通俗易懂]利用Pycharm连接服务器前言当下,很多深度学习的模型需要高配置的设备来跑,本地的pc可能无法满足要求。所以就需要利用服务器来训练,但是在服务器上操作代码不是很方便。利用Pycharm可以在本地编写/修改代码,能够同步到服务器上,并且能直接在本地利用pycharm运行同步到服务器上的代码。非常的方便。-前提一台装有anaconda的服务器,本地装了专业版的pycharm。操作步骤步骤一:在pycharm上使用服务器的python环境用pycharm任意打开一个项目,从工具栏中选择Fil

  • MySQL删除表数据 MySQL清空表命令 3种方法

    MySQL删除表数据 MySQL清空表命令 3种方法一、MySQL清空表数据命令:truncateSQL语法:truncatetable表名注意:不能与where一起使用。 truncate删除数据后是不可以rollback的。 truncate删除数据后会重置Identity(标识列、自增字段),相当于自增列会被置为初始值,又重新从1开始记录,而不是接着原来的ID数。 truncate删除数据后不写服务器log,整体删除速度快。 truncate删除数据后不激活trigger(触发器)。二、MySQL删除表命令:

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号