Python3 使用xpath匹配爬取彼岸壁纸高清美女图片

Python3 使用xpath匹配爬取高清美女图片!

写代码必做的三件事:
1.做笔记,注意细节!
2.代码一定要加上注释!
3.思路一定要清晰!
最终结果图:
在这里插入图片描述
全部都是高清大图:1920x1080
网站链接:点我

# 目标:…………………………………………………………………………

# 导入库/模块
from lxml import etree
import requests
import time
import sys
import re
# 使用类来编写相关代码
# 1.获取主页源码数据!
class Adi(object):
    # 封装响应头
    headers = {
    
    
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.57'}
    def __init__(self):  # 使用__init__初始化方法当调用该类时运行给当中默认的代码
        # 让用户自由选择下载类型URL
        self.input_url = input("请输入你要下载的页面连接>>>")
        # 使用正则匹配用户输入的url中的动态内容
        self.re_data = re.search('http://.*/(.*)/',self.input_url)
        # 因为是只匹配一个对象,所以使用search(),searc()会返回匹配到的全部内容所以使用group提取出来表达式中()括号匹配到的内容
        self.re_data=self.re_data.group(1)
        # 让用户自己选择需要下载的页数!
        self.input_page = int(input('请输入start页数>>>'))
        self.input_page_one = int(input('请输入end页数>>>'))
    def home(self): # 这个本来是区分几个方法的发现太麻烦了,就全部塞一起了……
        # 遍历用户输入的页数
        for page_code in range(self.input_page, self.input_page_one+1):
            # 因为第一页没有index加页码.htm所以加一个判断区分!(第二页开始是加页码的)
            # ==1也就是第一页不加页码,否则动态添加页码!
            if page_code == 1:
                self.input_url = self.input_url
            else:
                self.input_url = f'http://www.netbian.com/{self.re_data}/index_{page_code}.htm'
            # 向父页(首页)发送请求
            self.response = requests.get(url=self.input_url,headers=self.headers)
            # 获取响应数据!(.text嫌麻烦就直接加在发送请求的括号后面!)
            self.response_data = self.response.text
            # 初始化一个etree.HTML解析到的数据!
            tree = etree.HTML(self.response_data,etree.HTMLParser())
            # 使用xpath匹配(层级匹配)页面中a标签的链接,
            tree_one = tree.xpath('//div[@class="list"]/ul/li/a/@href')
            print(f'正在download第{page_code}页内容')
            time.sleep(2)  # 设一下睡眠时间,防止人家服务器暴走
            # 向xpath匹配到整个页面的所有a标签(也就是第二个页面)的url单独发送一个请求!
            for child_page in tree_one:
                # 链接不完整所以要自己整合一下
                child_url =f'http://www.netbian.com/{child_page}'
                #向a标签的url发送请求
                self.response_tow = requests.get(url=child_url,headers=self.headers)
                # requests返回的编码是服务端默认编码:'iso-8859-1',跟原来页面的编码对不上所以要指定一下为gbk
                self.response_tow.encoding = "gbk"
                # 获取响应数据
                self.response_data_tow = self.response_tow.text
                # 初始化一个etree.HTML解析到的数据!
                tree = etree.HTML(self.response_data_tow, etree.HTMLParser())
                # 继续使用xpath匹配tree数据,这次要获取的是最终我们想要的图片url,因为xpath返回的是列表所以要提取出来!
                # 不然发送不了请求, 因为请求的url必须是str
                tree_tow = tree.xpath('//div[@class="pic"]/p/a/img/@src')[0]
                # 顺便匹配一下图片名,供后面写入文件使用!
                tree_title = tree.xpath('//div[@class="pic"]/p/a/img/@alt')[0]
                # 发送请求
                response_three = requests.get(url=tree_tow,headers=self.headers)
                # print(response_three.status_code) # 打印一下状态码,还是老样子,200表示成功
                # 获取响应数据,图片为二进制所以要用.content
                response_data_three =response_three.content
                print(f'正在download{tree_title}请等待###########')
                # 做持久化存储!
                with open(f'./bian_img/{tree_title}.jpg','wb') as adi_data:
                    adi_data.write(response_data_three)
                print(f'{tree_title}已download success!\n')
                time.sleep(1.2) # 记得设置一下延时,不然服务暴走以后就没得玩了
            print(f'第{page_code}页已全部download success!\n\n')

# 实例化类/创建对象
adi = Adi()
adi.home()
#关闭/退出程序!
exit()

以上是个人练习案例总结。切勿用作商业或者非法用途!仅供学习参考!
启发:欠着!

猜你喜欢

转载自blog.csdn.net/qq_43082279/article/details/112679409