小言_互联网的博客

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

311人阅读  评论(0)

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()

这样是不是就满足了啊!!! 我觉得还有待发掘的地方 不出我所料

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

功夫不负好色心,终于一顿排错之后得到了

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()

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

继续下一个用法


转载:https://blog.csdn.net/bbbbb1996/article/details/101636822
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场