# -*- coding:utf-8 -*-
#获取网页源码/下载图片/网页/视频等
import requests
#解析网页相关数据
from lxml import etree
#操作文件夹/路径
import os
#1.下载网页源码
#2.解析网页源码(难度比较大)
#3.存储相关数据
#1
url = "http://www.ivsky.com/tupian/ziranfengguang/"
response = requests.get(url)
#2
#content /text 只不过数据类型不一样
#将网页源码解析为根节点
root = etree.HTML(response.content)
#3.
#根据xpath来定位相关数据
#顺序:ul li a
#注意:xpath返回的一定是个列表
a_list = root.xpath("//ul[@class='tpmenu']/li/a")
#对列表进行切片,跳过"所有分类"这个元素
#a_list = a_list[1:]
for a in a_list[1:]:
#print(a)a是元素类型的,只要是元素类型的都可以利用xpath
#text()表示获取标签之间的文本内容
big_title = a.xpath("text()")[0]
#获取标签中的某个属性 @某个属性
big_url = a.xpath("@href")[0]
if not big_url.startswith("http"):
big_url="http://www.ivsky.com"+big_url
print(big_title,big_url)
#下载小分类
big_response = requests.get(big_url)
#解析
big_root = etree.HTML(big_response.content)
big_a_list = big_root.xpath("//div[@class='sline']/div/a")
for big_a in big_a_list:
small_title = big_a.xpath("text()")[0]
small_url = big_a.xpath("@href")[0]
if not small_url.startswith("http"):
small_url="http://www.ivsky.com"+small_url
print(small_title,small_url)
#文件夹路径,,电脑上利用\,\n转义字符
path="images/"+big_title+"/"+small_title
#如果路径对应的文件夹不存在,那么创建,防止多次运行时,文件夹已经存在,出现创建失败的错误
if not os.path.exists(path):
#makedirs=MakeDirectory 根据路径创建文件夹
os.makedirs(path)
#处理图片 #div a img
page = 1
old_small_url=small_url
#加入循环,,能够处理下一页的内容(模拟所有页)
while True:
#默认下载第一页
small_response = requests.get(small_url)
# #获取状态码
# small_response.status_code
small_root = etree.HTML(small_response.content)
img_list = small_root.xpath("//div[@class='il_img']/a/img")
#列表为空,,退出循环
if not img_list:
break
for idx,img in enumerate(img_list):
src=img.xpath("@src")[0]
#分割地址,取名称
# name = src.split("/")[-1]
#图片名称换一种方法
name = img.xpath("@alt")[0] + str(page) + "_" + str(idx) + ".jpg"
img_response = requests.get(src)
f=open(path+"/"+name,"wb")
f.write(img_response.content)
f.close()
page += 1
small_url=old_small_url+"/index_%s.html" %page
爬取自然风景网的图片
最新推荐文章于 2022-08-14 19:55:17 发布