爬虫第二天-------------------------------------笔记(Xpath)

lxml(xpath)

首先安装一个神器总比正则直观,毕竟正则你得输出了才知道获取的数据(像我这种正则比较渣的完全不能确定对不对).而xpath可以直观的看到.

打开谷歌浏览器 右上角打开

在这里插入图片描述

用谷歌商店下载一个XPath Helper. 网上很多教程 可以去试试,我感觉挺好用的

关于语法–>XPath语法

还是以树洞刚才那个二熊做例子

在这里插入图片描述

这样就能直观的验证语法对不对了

好吧 我又不懂从哪里撸来了一个美女姐姐的博客 , 刚好试试XPath的威力

在这里插入图片描述

思路:找到需要的数据的祖宗–>最小的儿子–>@我们的数据

OK,还是爬虫核心套路(与re不同的发现了吗!):

import urllib.request
from lxml import etree

def create_request():
    url = 'http://loftermeirenzhi.lofter.com/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
    }
    req = urllib.request.Request(url=url, headers=headers)
    return req

def download_content(req):
    res = urllib.request.urlopen(req)
    content = res.read().decode('utf-8')
    return content

def parse_content(content):
    # XPath语法
    img_xpath = '//div[@class="m-postlst box"]//div[@class="pic"]/a//@src'
    # 封装成HTML
    tree = etree.HTML(content)
    # 在用XPath语法解析
    img_list = tree.xpath(img_xpath)
    return img_list

def save_images(img_list, path):
    # 这个j是不是很巧妙呀
    j = 1
    # 将爬取回来的网页进行整理
    for src in img_list:
        url_src = src.split('?')[0]
        # 拿出格式
        img_pattern = url_src.split(".")[-1]
        # 构建图片名字
        file_name = path + "/" + str(j) + "." + img_pattern
        urllib.request.urlretrieve(url_src, file_name)
        j += 1

def main():
    path = "./image_girl"
    # 创建请求
    req = create_request()
    # 下载数据
    content = download_content(req)
    # 解析数据
    image_girl = parse_content(content)

    # 保存数据
    save_images(image_girl, path)

if __name__ == "__main__":
    main()

在这里插入图片描述

这样是不是就满足了啊!!! 我觉得还有待发掘的地方 不出我所料[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mkhmQyBc-1569673935468)(F:\paday\imgae\boke_3.png)]

点开这个就发现成套成套小姐姐美图,不得了那不是就得继续啦

功夫不负好色心,终于一顿排错之后得到了.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7MrZYyd-1569673935470)(F:\paday\imgae\boke_4.png)]

200多张套图 全是高清的下载起来有点慢(记得设置点时间- -不然这样对人家服务器不友好),听说有分布式爬虫几秒就搞定了 = =暂时还不会

import urllib.request
from lxml import etree
import time

def create_request():
    url = 'http://loftermeirenzhi.lofter.com/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
    }
    req = urllib.request.Request(url=url, headers=headers)
    return req

def download_content(req):
    res = urllib.request.urlopen(req)
    content = res.read().decode('utf-8')
    return content

def parse_content(content):
    # XPath语法
    img_xpath_href = '//div[@class="m-postlst box"]//div[@class="pic"]/a//@href'
    # 名字
    # 封装成HTML
    tree = etree.HTML(content)
    # 在用XPath语法解析
    img_set = tree.xpath(img_xpath_href)
    # 得到我们的成套成套小姐姐的网站列表
    return img_set

def set_img(img_set):
    dict_gril = {}
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
    }
    for href in img_set:
        url = '{}'.format(href)
        req = urllib.request.Request(url=url, headers=headers)
        content = download_content(req)
        gril_href = '//div[@class="g-mn"]//div[@class="pic"]/a//@src'
        # //div[@class="g-mn"]//div[@class="text"]/p 不行 其实我也不知道为啥 - - 应该是没有text()吧
        name_href = '//div[@class="g-mn"]//div[@class="text"]/p/a/text()'
        tree = etree.HTML(content)
        # 图片集
        gril_set = tree.xpath(gril_href)
        # 名字
        bozhu = tree.xpath(name_href)
        # 这个是列表 得弄成str
        bozhu_name = ''.join(bozhu)
        # 转成字典好按名字存储
        dict_gril[bozhu_name] = gril_set[:]
        time.sleep(2)
    return dict_gril


def save_images(dict_gril, path):

    # 将爬取回来的网页进行整理

    for key, value in dict_gril.items():
        j = 1
        for src in value:
            url_src = src.split('?')[0]
            # 拿出格式
            img_pattern = url_src.split(".")[-1]
            # 构建图片名字  因为key哪里名字有:所以得取到最后第二位而已
            file_name = path + "/" + key[:-1] + '_{}'.format(j) + "." + img_pattern
            urllib.request.urlretrieve(url_src, file_name)
            j += 1


def main():
    path = "./image_girl"
    # 创建请求
    req = create_request()
    # 下载数据
    content = download_content(req)
    # 解析数据
    img_set = parse_content(content)

    dict_gril = set_img(img_set)
    # 保存数据
    save_images(dict_gril, path)


if __name__ == "__main__":
    main()

然后按照这思路 没有反爬手段网站对我们来说都轻而易举可以爬取啦 = =

继续下一个用法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值