Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

其实不少编程语言均可以作爬虫,例如java、c#、php等等甚至excel均可以抓网页的图表,那么为何咱们要用Python呢?它简单、便捷,并且有好多库能够选择,能够说python是写爬虫的首选了!php

今天就来带你们写一个简单而又完整的爬虫,咱们来抓取整站的图片的,而且保存到电脑上!html

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

准备工做

工具:Python3.六、pycharmjava

库:requests、re、time、random、ospython

目标网站:妹子图(具体url你们本身去代码里看。。。)正则表达式

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

在写代码以前

在咱们开始写代码以前,要先对网站进行分析,重点有这个几个地方:编程

一、先判断网页是否静态网页,这个关系咱们采用的爬虫手段!c#

简单的说,网页中的内容,在网页源代码中均可以找到,那么就能够判定,这个网站是静态的了;若是没有找到,就须要去开发者工具中查找,看看是抓包呢仍是分析js结构或者其余的方式。浏览器

二、看看网页的结构,大体清楚抓取目标数据,须要几层循环,每次循环的方式,以及是否保证没有遗漏!服务器

三、根据网页源代码来决定采用的匹配方式app

通常来讲,正则表达式是处理字符串最快的方式,可是在爬虫中它的效率并非很高,由于它须要遍历整个html来匹配相关内容,若是网页源代码比较规整的话,建议采用bs4或者xpath等等解析网页结构的方式比较好!

固然,今天咱们是基础向的爬虫,就用正则表达式了,毕竟正则是必须掌握的内容!

那么,具体怎么写爬虫代码呢~?简单的举例给你们说下:

若是是手工操做的话,大概是这个流程

打开主页==>选择一个分类==>选择一个图集==>依次选择图片==>右键保存==>重复以上保存其余图片

那么这个过程放到代码中呢,它的结构大概是这样:

访问主页url==>找到并循环全部分类==>建立分类文件夹==>访问分类url==>找到页码构建循环分类全部页==>循环页面全部图集==>建立图集文件夹==>找到图集内全部图片url==>保存到对应文件夹

好了,思路也有了,那就废话很少说了,咱们来写代码吧~!

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

开始写代码

首先是导入上述的各类库,没有的须要安装一下!而后写入如下几行代码获取网页源代码看看是否有反爬:

import requests
import time
import random
import re
import os


url = 'http://www.meizitu.com/'
html = requests.get(url)
html.encoding = 'gb2312'

若是能顺利打印出源代码且和网页右键查看的源代码一致,那么能够断定该网站基本没有反爬了!

第16行代码的含义是给html设定编码格式。由于Python3默认是utf-8,若是网站不是这个编码格式的话,会出现乱码,因此咱们直接指定一下。

接下来呢,就是找到全部分类的名字和url了,来看看网页中和源代码中,它的位置在哪

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

所有在a标签的属性中,那么咱们能够用一行代码获取了

infos = re.findall(r'a href="(http://www.meizitu.com/.*?html)" target="_blank" title="(.*?)" ',html.text)

这里用正则匹配,2个括号中的内容就是咱们须要的url和名字了,而后开始构建循环遍历全部的分类

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

上一步取出的infos是列表,并且每个元素都是一个元组,格式为(url,名字),全部咱们用2个元素去遍历infos,来获取咱们须要的内容,先打印下看看结果是否正确!

这里先不建立文件夹,先进行下一步,访问分类的url,而后开始构建分类中的页码吧!分析网页发现,全部的页码都在下方,可是仍是稍有不一样:没有当前页、多了下一页和末页

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

因为存在图集不足一页的状况(上述源代码就不会出现),因此咱们这么处理循环

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

19-21行获取分类的源代码,22行获取全部页码的url,而后用set()函数去重,再新建一个空列表,将分类的url加进去,注意,元组是不能用append()方法添加到列表中的,因此要先将set元组转化为列表而后分别从新拼接列表内全部的url,在将2个列表相加的方式合并为一个列表!这样咱们就获得了分类下全部翻页页面的url

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

循环全部的url,获取全部图集的url列表,27行没有用encoding指定编码是由于这里我不须要取到中文的内容,因此简写了一下!终于该取图片了!

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

图集的title和图集内全部图片的url都取到了!其实到这里就已经完成了爬虫的80%了!剩下的20%就是保存图片到本地,这里就很少说了,给你们提供2个代码片断,一个是新建文件夹并判断是否存在,一个是剔除字符串内不符合命名要求的字符

path = 'E://python/mn/meizitu/%s/'%sor#路径
if os.path.exists(path):#判断路径及文件夹是否存在,不存在即建立
	pass
else:
	os.mkdir(path)
def new_title(title):
	rstr = r"[\/\\\:\*\?\"\<\>\|]"  # '/ \ : * ? " < > |'
	new_title = re.sub(rstr, "_", title)  # 替换为下划线
	return new_title

最终完整代码和运行效果

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

在请求中加入了时间模块的暂停功能,不加入的话可能会被网页拒绝访问!

在最后请求图片地址的时候,须要加入UA来告诉服务器你是浏览器而不是脚本,这个是最经常使用的反爬手段了

#author:云飞
#QQ群542110741
import requests
import time
import random
import re
import os

def new_title(title):
	rstr = r"[\/\\\:\*\?\"\<\>\|]"  # '/ \ : * ? " < > |'
	new_title = re.sub(rstr, "_", title)  # 替换为下划线
	return new_title

url = 'http://www.meizitu.com/'
html = requests.get(url)
html.encoding = 'gb2312'
infos = re.findall(r'a href="(http://www.meizitu.com/.*?html)"  target="_blank" title="(.*?)" ',html.text)
i = 1
for sor_url,sor in infos:
	sor = new_title(sor)
	path = 'E://python/mn/meizitu/%s/'%sor#路径
	if os.path.exists(path):#判断路径及文件夹是否存在,不存在即建立
		pass
	else:
		os.mkdir(path)
	time.sleep(random.random())
	sor_html = requests.get(sor_url)
	sor_html.encoding = 'gb2312'
	atlas = set(re.findall(r"<li><a href='(.*?html)'>\d+</a></li>",sor_html.text))
	atlas_lis = []
	atlas_lis.append(sor_url)
	atlas_lis += [url+'a/'+x for x in list(atlas)]
	for atla in atlas_lis:
		atla_html = requests.get(atla).text
		at_url_lis = re.findall(r'h3 class="tit"><a href="(http://www.meizitu.com/.*?html)"  targe',atla_html)
		for at_url in at_url_lis:
			at_html = requests.get(at_url)
			at_html.encoding = "gb2312"
			atlas_title = ''.join(re.findall(r'<title>(.*?)</title>',at_html.text))
			atlas_title = new_title(atlas_title)
			img_path = 'E://python/mn/meizitu/%s/%s/'%(sor,atlas_title)
			if os.path.exists(img_path):#判断路径及文件夹是否存在,不存在即建立
				pass
			else:
				os.mkdir(img_path)
			img_urls = re.findall(r'src="(http://mm.chinasareview.com/.*?jpg)" /><br />',at_html.text)
			k = 1
			for img_url in img_urls:
				header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0'}
				data = requests.get(img_url,headers=header).content#获取图片的二进制格式
				with open('%s%s'%(img_path,img_url.split('/')[-1]),'wb') as f:
					f.write(data)
				print("【正在下载】 {%s}的第%d张图片,一共下载了%d张图片"%(atlas_title,k,i))
				i += 1
				k += 1

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

下载一段时间后的效果

Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!

相关文章
相关标签/搜索