目录
用到的库:
from lxml import etree
import os
import datetime
import requests
思路:
因为我要爬取某个分类下的所有图片,所以首先我要分析这个url
的组成。
思路如下:获取每一页的url
→ 获取每一页的28个详情页面的url
→ 获取每一详情页下的原图url
→ 下载每组图片的原图到本地。最后使用循环进行爬取。
需要知道的xpath用法:
- 选择某个标签,使用 /,也可以多层查找,如/html/body/h2
- 获取所有信息,使用 //,如//p,将p标签的所有信息都提取出来
- 获取文本内容:text()
- 获取注释:comment()
- 获取其它任何属性:@xx,如:@href、@src、@title
使用xpath之前,先生成一个xpath对象。
分析:
图中红线即为这一组图片真实的链接
用下面的xpath解析式:
xpath('//div[@class="content"]/div/div/div/a/@href')
图中红线为一个图集内,图片的真实链接
获取到图片的链接后,用二进制流的方式保存到本地。
具体代码:
from lxml import etree
import os
import datetime
import requests
# 下载图片(获取某一页图片链接并下载)
def downloadImage(url,pathway):
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
}
res = requests.get (url='https://'+url, headers=headers) #加个头,伪装一下
res.encoding = res.apparent_encoding #设置编码格式,防止乱码,好像这个网站,不设置也可以
dom=etree.HTML(res.text) #etree.html 生成一个xpath对象,参数必须是string类型
src=dom.xpath('//div[@id="piclist"]/ul/li/img/@src') #获取一个图集内图片的链接
title=dom.xpath('//div[@class="container"]/div/div/div/div/div/h1/text()') #获取标题
firstsrc = src[0]
filetype = firstsrc[-4:] #获取图片类型,个人觉得不获取也可以
path = pathway + "/性感美女/" + title[0] + "/"
if not os.path.exists (path):
os.makedirs(path)
i = 1 #给一组图片记个数
for img in src:
imgUrl = "https:" + img
temp=requests.get(imgUrl,headers=headers)
with open(path+'/'+str(i)+str (filetype),'wb') as f:
f.write(temp.content)
print("图片下载成功:"+imgUrl)
i+=1
pathway = 'G://image' #存储路径
startPage = 4 #起始页
endPage = 9 #终止页,左闭右开
urlList = "https://www.mn52.com/"+"xingganmeinv"+"/list_1_" #1代表性感美女类型
print(" == 即将开始精彩资源的下载 == ")
startNum = int(startPage)
endNum = int(endPage)
startTime = datetime.datetime.now()
for n in range(startNum,endNum):
realurl = urlList + str(n) + '.html' #获得每一页的链接
response = requests.get(realurl)
content=response.text
dom = etree.HTML(content) #生成一个xpath对象
src=dom.xpath('//div[@class="content"]/div/div/div/a/@href') #获取每一组图片的链接
for img in src:
path = img.strip("//")
indexImg = src.index(img)
#异常处理:遇到异常信息跳过
# try:
print("开始下载该组图:" + path)
starttime = datetime.datetime.now()
downloadImage(path,pathway)
endtime = datetime.datetime.now()
print (" 下载成功,耗时:" + str(endtime - starttime))
print (" =========> 第"+ str(indexImg+1) +"组图片下载完成 <=========")
print("")
# except Exception as e:
# print(" =========> 第"+ str(indexImg+1) +"组图片下载错误 <=========")
# pass
# continue
print("===========================> 第"+ str(n) +"页图片列表下载完成 <===========================")
endTime = datetime.datetime.now()
print ("下载成功,耗时::" + str(endTime - startTime))
成果图:
总结:
边写代码,边报bug,边学习新知识,带着目的去学习会更好,
res.encoding = res.apparent_encoding #设置编码格式,防止乱码,
dom=etree.HTML(res.text) #etree.html 生成一个xpath对象,参数必须是string类型
if not os.path.exists (path):
os.makedirs(path)
mkdir只能创建一级文件,而makedirs可以创建多级文件
with open(path+'/'+str(i)+str (filetype),'wb') as f:
f.write(temp.content)
加油,少年,下一次爬音乐or视频or小说?