首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

自从看了这篇文章,再也不用担心爬不到心仪女神的图片了!

目的:

爬取网站大量图片

对于抓取的图片进行分类保

环境配置:

系统环境:WIN8

编译环境:Python3.5

所需库:requests、re、os、pymongo、Beatifulsoup、time

IDE:Pycharm

学前疑惑:

如何找到各个图片的地址接口

如何遍历图片地址,批量保存图片

如何保证爬虫能长期运行不中断

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

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

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

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

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

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

代码如下:

# -*- 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",

"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/24656/",

'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='F:spiderpicturezhainan2{}'.format(dir_name)

try:

os.mkdir(dir_path)

print("创建文件夹成功")

except:

pass

file_path='.'.format(dir_path,str(i).zfill(3),'jpg')

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

代码已经是纯傻瓜式,只要有requests和beautifulsou这两个库,就能开始自动运行保存。

如果要自己修改爬取范围,贼修改代码最上方的start和end,自己打开网站找到需要爬取的图集,或者直接遍历从10000-30000之间。

成果:(吐槽两句,之前竟然被举报,知乎说违反了法律法规,那还是低调一些吧。)

运行了几十分钟,就抓了5000多张图片。

运行久一些,整个网站所有图片你都能抓下来。

如果需要特别图片类型分类的话,可以写一个爬取网站中指定分类下图集链接,再遍历爬取。

再放上之前的爬虫文章,可以参照学习一下。

最后有什么疑问都可以在评论中指出来哦,如果觉得不错学习了,也希望动动小手给小编一个关注,么么哒!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180407A00T4M00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券