bs4-爬取图片--xpath复习

# -*- coding:utf-8 -*-
from urllib import request
from bs4 import BeautifulSoup
import os
from fake_useragent import UserAgent
agent = UserAgent()


class IvskySpider(object):

    def __init__(self):
        self.url = 'http://www.ivsky.com'
        self.headers = {
            'User-Agent': agent.random,
            'Host': 'www.ivsky.com'
        }
        self.html = ''

    # 请求函数
    def get_html(self, url):
        req = request.Request(url, headers=self.headers)
        response = request.urlopen(req)
        self.html = response.read().decode('utf-8')

    # 解析列表页函数
    def parse_list(self):
        # 创建bs 对象
        bs = BeautifulSoup(self.html, 'lxml')
        res = bs.select('.ali p a')
        # print(res)
        for ele in res:
            # 从主页获取该图片的链接,点击进去(x张)
            href = ele['href']
            title = ele.string
            print(href, title)
            # 拼接详情页url
            url = self.url + href
            self.get_html(url)
            # 根据分类标题,创建文件夹
            path = 'images/' + title
            if not os.path.exists(path):
                os.makedirs(path)
            # 解析详情页面数据
            self.parse_detail(path)
        # 找到下一页链接
        next_ele = bs.find(class_='page-next')
        if next_ele:
            # 获取下一页链接
            next_href = next_ele['href']
            page = next_href.split('_')[-1].split('.')[0]
            print('正在爬取第%s页' % page)
            # 拼接完整的url地址
            url = self.url + next_href
            # 发起请求
            self.get_html(url)
            # 调用本身函数,解析下一页数据
            self.parse_list()
        else:
            print('没有下一页')

    # 解析详情页面数据
    def parse_detail(self, path):
        """
         高清图  http://img.ivsky.com/img/tupian/pre/201712/11/limao_nvhai-010.jpg
         缩略图  http://img.ivsky.com/img/tupian/t/201712/11/limao_nvhai-010.jpg
        """
        bs = BeautifulSoup(self.html, 'lxml')
        # 找到图片
        imgs = bs.select('.pli li div img')
        for img in imgs:
            try:
                src = img['src']
                # 替换链接中的/t/ 获取高清图片的链接
                src = src.replace('/t/', '/pre/')
                # 分割图片名称
                name = src.split('/')[-1]
                # 拼接图片完整存放路径
                img_path = path + '/' + name
                request.urlretrieve(src, img_path)
            except Exception as e:
                print(e)
        # 找到下一页
        next_ele = bs.find('page-next')
        if next_ele:
            next_href = next_ele['href']
            url = self.url + next_href
            self.get_html(url)
            self.parse_detail(path)
        else:
            print('没有下一页')

    def start(self):
        self.get_html('http://www.ivsky.com/tupian')
        self.parse_list()


if __name__ == '__main__':
    tt = IvskySpider()
    tt.start()

完整代码:

# -*- coding:utf-8 -*-
from urllib import request
from bs4 import BeautifulSoup
import os
from fake_useragent import UserAgent
agent = UserAgent()


class IvskySpider(object):

    def __init__(self):
        self.url = 'http://www.ivsky.com'
        self.headers = {
            'User-Agent': agent.random,
            'Host': 'www.ivsky.com'
        }
        self.html = ''

    # 请求函数
    def get_html(self, url):
        req = request.Request(url, headers=self.headers)
        response = request.urlopen(req)
        self.html = response.read().decode('utf-8')

    # 解析列表页函数
    def parse_list(self):
        # 创建bs 对象
        bs = BeautifulSoup(self.html, 'lxml')
        res = bs.select('.ali p a')
        # print(res)
        for ele in res:
            # 从主页获取该图片的链接,点击进去(x张)
            href = ele['href']
            title = ele.string
            print(href, title)
            # 拼接详情页url
            url = self.url + href
            self.get_html(url)
            # 根据分类标题,创建文件夹
            path = 'images/' + title
            if not os.path.exists(path):
                os.makedirs(path)
            # 解析详情页面数据
            self.parse_detail(path)
        # 找到下一页链接
        next_ele = bs.find(class_='page-next')
        if next_ele:
            # 获取下一页链接
            next_href = next_ele['href']
            page = next_href.split('_')[-1].split('.')[0]
            print('正在爬取第%s页' % page)
            # 拼接完整的url地址
            url = self.url + next_href
            # 发起请求
            self.get_html(url)
            # 调用本身函数,解析下一页数据
            self.parse_list()
        else:
            print('没有下一页')

    # 解析详情页面数据
    def parse_detail(self, path):
        """
         高清图  http://img.ivsky.com/img/tupian/pre/201712/11/limao_nvhai-010.jpg
         缩略图  http://img.ivsky.com/img/tupian/t/201712/11/limao_nvhai-010.jpg
        """
        bs = BeautifulSoup(self.html, 'lxml')
        # 找到图片
        imgs = bs.select('.pli li div img')
        for img in imgs:
            try:
                src = img['src']
                # 替换链接中的/t/ 获取高清图片的链接
                src = src.replace('/t/', '/pre/')
                # 分割图片名称
                name = src.split('/')[-1]
                # 拼接图片完整存放路径
                img_path = path + '/' + name
                request.urlretrieve(src, img_path)
            except Exception as e:
                print(e)
        # 找到下一页
        next_ele = bs.find('page-next')
        if next_ele:
            next_href = next_ele['href']
            url = self.url + next_href
            self.get_html(url)
            self.parse_detail(path)
        else:
            print('没有下一页')

    def start(self):
        self.get_html('http://www.ivsky.com/tupian')
        self.parse_list()


if __name__ == '__main__':
    tt = IvskySpider()
    tt.start()

# -*- coding:utf-8 -*-

from lxml import etree

# parse()函数
# 用来解析本地的html文件
# ElementTree  html源代码解析之后转换为一个ElementTree对象
html = etree.parse('index.html')
print(html)

# ElementTree 也可以转换为一个字符串对象
string = etree.tostring(html).decode('utf-8')
print(type(string))

# 找到a标签 通过标签名找到所有的标签
# 返回结果列表,列表中存放的是找到的是Element标签对象
res = html.xpath('//a')
print(res)
for ele in res:
    print(ele)
    # @属性名  查找标签的属性值
    # text() 标签内的文本内容
    href = ele.xpath('@href')[0]
    text = ele.xpath('text()')[0]
    print(href, text)

res = html.xpath('//a/@href')
print(res)
# /text()获取当前标签的直接子标签
# //text()获取当前标签和子孙标签内的所有文本
res = html.xpath('//a//text()')
print(res)

# 获取指定位置的标签
# //div[@属性名= 属性值]/标签/标签名[number]  number指定找到第几个顺序的标签
res = html.xpath('//div[@id="main"]/ul/li[3]')
print(res[0].xpath('text()'))

# 获取指定属相包含某个属性值的标签
# * 可以表示任意标签名
# contains(@属性名, 属性值) 找到某个属性包含某个属性值的标签
res = html.xpath(".//*[contains(@class, 's')]")
print(res)

# 第一种方式 直接找h1标签
res = html.xpath('//h1[@class="content s"]')
print(res[0].xpath('text()'))
# 第二种方式
res = html.xpath('//p[@class="top"]/h1[contains(@class,"s")]')
print(res)

完整代码

# -*- coding:utf-8 -*-

from lxml import etree

# parse()函数
# 用来解析本地的html文件
# ElementTree  html源代码解析之后转换为一个ElementTree对象
html = etree.parse('index.html')
print(html)

# ElementTree 也可以转换为一个字符串对象
string = etree.tostring(html).decode('utf-8')
print(type(string))

# 找到a标签 通过标签名找到所有的标签
# 返回结果列表,列表中存放的是找到的是Element标签对象
res = html.xpath('//a')
print(res)
for ele in res:
    print(ele)
    # @属性名  查找标签的属性值
    # text() 标签内的文本内容
    href = ele.xpath('@href')[0]
    text = ele.xpath('text()')[0]
    print(href, text)

res = html.xpath('//a/@href')
print(res)
# /text()获取当前标签的直接子标签
# //text()获取当前标签和子孙标签内的所有文本
res = html.xpath('//a//text()')
print(res)

# 获取指定位置的标签
# //div[@属性名= 属性值]/标签/标签名[number]  number指定找到第几个顺序的标签
res = html.xpath('//div[@id="main"]/ul/li[3]')
print(res[0].xpath('text()'))

# 获取指定属相包含某个属性值的标签
# * 可以表示任意标签名
# contains(@属性名, 属性值) 找到某个属性包含某个属性值的标签
res = html.xpath(".//*[contains(@class, 's')]")
print(res)

# 第一种方式 直接找h1标签
res = html.xpath('//h1[@class="content s"]')
print(res[0].xpath('text()'))
# 第二种方式
res = html.xpath('//p[@class="top"]/h1[contains(@class,"s")]')
print(res)

index文件内容:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8"/>
        <title>xpath的基本用法</title>
    </head>
    <body>
        <a  class="top s" href="http://www.baidu.com">百度一下<h1>你就知道</h1></a>
        <div id="main">
            <ul>
                <li>Python</li>
                <li class="s">JavaScrip</li>
                <li>HTML</li>
                <li>ElasticSearch</li>
                <li>
                    <a href="http://zhiyou100.com" target="_blank">智游</a>
                    <p>
                        <h1 class="content top">标题1</h1>
                    </p>
                    <p class="top">
                        <h1 class="content s">标题2</h1>
                        <h1 id="ooo">标题</h1>
                        <h1 id="ttt">ttt</h1>
                    </p>
                    <p>
                        <h1 class="content">标题3</h1>
                    </p>
                    <p>
                        <h1 class="content">标题4</h1>
                    </p>
                </li>
            </ul>
        </div>
    </body>
</html>












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值