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)
blank

相关推荐

  • Servlet账户登陆优化

    Servlet账户登陆优化

  • navicat 15.02 激活码[在线序列号]

    navicat 15.02 激活码[在线序列号],https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 防止Lambda的各种坑爹(二)

    防止Lambda的各种坑爹(二)

  • 详解独立成分分析

    详解独立成分分析最近在学习数据降维的一些方法(有关数据降维的其他内容请看这篇文章),虽然独立成分分析不算是严格意义上的降维方法,但是它和PCA有着千丝万缕的联系,所以打算专门写一篇文章来学习ICA的相关知识,看了挺多的关于ICA的博文,有些文章讲的比较详细。有句话是这么说的:“论文是详细版的知识讲解”,也就是说如果想深入详细的了解某个知识,那么去读相关论文,所以阅读了一篇经典的ICA论文,作者是A.Hyva¨r…

  • PS2手柄遥控Arduino小车[通俗易懂]

    PS2手柄遥控Arduino小车[通俗易懂]使用手柄遥控小车是经常要用到的,看到PS2手柄很6,就拿来尝试一下。PS2手柄是索尼的PlayStation2游戏机的遥控手柄,因为这款手柄性价比较高,按键丰富,方便扩展到其它应用中,后来有人将其通讯协议破解,使得手柄可以用在遥控其他电器上,比如遥控控制机器人小车。最主要的是这款手柄,拿来就可以用,有人已经将其通讯协议破解了。具体可以参考极客工坊。其PS2X_lib库,可以参见Github

  • 怎么修改Ubuntu更新源服务器为国内地址

    怎么修改Ubuntu更新源服务器为国内地址 Ubuntu系统安装完默认更新源是国外服务器,总所周知的原因我天朝连接外国的速度那是很有讲究的,如果偶尔用用Ubuntu也就无所谓了,但是经常使用肯定会让你崩溃的,国内国外速度相差十倍都不止。更新源地址也很简单,有两种方法,一种是如果安装了图形界面,通过配置中心来更改是很方便的;还有一种就是纯服务器版,没有图形界面通过更改配置文件来更换源地址,并且命令行的方法可以随意添加任何可用的更新源地址,…

发表回复

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

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