今天就来带大家写一个简单而又完整的爬虫,我们来抓取整站的图片的,并且保存到电脑上!
工具:Python3.6、pycharm
库:requests、re、time、random、os
目标网站:妹子图(具体url大家自己去代码里看。。。)
在我们开始写代码之前,要先对网站进行分析,重点有这个几个地方:
1、先判断网页是否静态网页,这个关系我们采用的爬虫手段!
简单的说,网页中的内容,在网页源代码中都可以找到,那么就可以断定,这个网站是静态的了;如果没有找到,就需要去开发者工具中查找,看看是抓包呢还是分析js结构或者其他的方式。
2、看看网页的结构,大致清楚抓取目标数据,需要几层循环,每次循环的方式,以及是否保证没有遗漏!
3、根据网页源代码来决定采用的匹配方式
一般来说,正则表达式是处理字符串最快的方式,但是在爬虫中它的效率并不是很高,因为它需要遍历整个html来匹配相关内容,如果网页源代码比较规整的话,建议采用bs4或者xpath等等解析网页结构的方式比较好!
当然,今天我们是基础向的爬虫,就用正则表达式了,毕竟正则是必须掌握的内容!
那么,具体怎么写爬虫代码呢~?简单的举例给大家说下:
如果是手工操作的话,大概是这个流程
打开主页==>选择一个分类==>选择一个图集==>依次选择图片==>右键保存==>重复以上保存其他图片
那么这个过程放到代码中呢,它的结构大概是这样:
访问主页url==>找到并循环所有分类==>创建分类文件夹==>访问分类url==>找到页码构建循环分类所有页==>循环页面所有图集==>创建图集文件夹==>找到图集内所有图片url==>保存到对应文件夹
好了,思路也有了,那就废话不多说了,我们来写代码吧~!
在请求中加入了时间模块的暂停功能,不加入的话可能会被网页拒绝访问!
在最后请求图片地址的时候,需要加入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
下载一段时间后的效果
------------------- End -------------------
欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
万水千山总是情,点个【在看】行不行
*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。
/今日留言主题/
随便说一两句吧~~