python爬虫--自动下载cosplay小姐姐图片(xpath使用自定义创建文件路径)

时间:2022-07-23
本文章向大家介绍python爬虫--自动下载cosplay小姐姐图片(xpath使用自定义创建文件路径),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

目录

  • 1.xpath使用
  • 2.遇到的 bug以及解决措施
    • 2.1bug
    • 2.2最终的解决方案
  • 3.效果展示
  • 4. 源码

1.xpath使用

使用之前,传统艺能就是先导入该模块parsel

之前我们匹配我们想要的内容比如链接,文字这些内容我们是不是都是通过正则表达式来爬取的 不知道大家看完之后是不是觉得正则表达式好难,不知道你们怎么觉得,反正博主自己觉得好难。 于是博主就发现了一个新的模块xpath,自己用完之后发现,卧槽!!!!!!这样爬虫也太简单了吧

其实大家根据xpath这个名字就能看出来他是通过路径来查找我们需要的元素的。 其实我们随便来一个页面来举例,就比如下面这个页面

我们通过f12来检查该网页,可以发现

既然HTML是这样一个层级结构的,那么我们当然可以通过这种结构来帮助我们快速获取到我们想要的元素。举个例子加入我想获取到当前我要的img控件,我们就可以通过下面的语句来实现

headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}
response=requests.get("http://www.win4000.com/meinvtag26_1.html",headers=headers)
html=response.text
parse=parsel.Selector(html)
# //表示略过多个标签直到找到符合我要的标签为止
title=parse.xpath('//ul[@class="clearfix"]/a/img').getall()

这样我们便获得了我们所有的img控件了 如果大家还是不会的话,谷歌浏览器已经帮我们一键完成了 直接点击该控件右击,就能获得该控件的path了,但是记住这样我们只能获取单个控件,就不能获取整个img列表了。所以这种方法只适用于爬取单个元素。

2.遇到的 bug以及解决措施

2.1bug

因为之前一直是直接存储到我们的python项目下的文件夹中,一旦量大了之后就会很影响我的观感体验,所以我想着能不能自定义存储路径,之后就遇到了这个bug 首先先明确你要创建的是多级目录还是单级目录, 如果是单级目录就使用:

os.mkdir(dir_name)

多级目录就使用:

os.makedirs(dir_name+'./'+dir_name1)

其次我们观察一下两个路径,看看他们有什么不同。 python项目下的文件路径是这样的:

python/pachong/.....

系统中的文件路径:

D:cosplay玛修·基列莱特cos美女性感车模写真

其实大家应该看出来了,主要就是 “/”“” 符号的差异,但是你要知道/无所谓,但是在python中代表是转义字符的意思。所以字符串中出现它编译器是不会将它看成字符串的而是直接进行转义操作,所以我们必须提示编译器将它看成是字符

2.2最终的解决方案

第一种可以通过用"\“来代替”"

dir_name = 'D:\aaa'+'\'+'bbb'
if not os.path.exists(dir_name):
    os.makedirs(dir_name)

第二种可以使用"./"来代替除第一个之后的所有,这样也能实现创建 其次还要注意一点就是我们不能直接写 ‘D:’ 这样编译器是会直接说我们是违法的,必须要在后面添加一个字符串比如这样 'D:cosplay’

"""创建文件夹名称"""
def createdir(dir_name1):
    dir_name=r'D:cosplay'
    if not os.path.exists(dir_name+'./'+dir_name1):
        os.makedirs(dir_name+'./'+dir_name1)
    return dir_name+'./'+dir_name1

3.效果展示

4. 源码

import time
import requests
import re
from bs4 import BeautifulSoup
import os
import parsel
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}
findImgsrc=re.compile(r'<img .*? data-original="(.*?)"')


def main():
    for i in range(5, 6):
        base_url = 'http://www.win4000.com/meinvtag26_{0}.html'.format(i)
        html=askurl(base_url)
        links=getlink(html)
        figurelinks(links)


"""分析所有得到的网页信息"""
def figurelinks(links):
    for link in links:
        newhtml=askurl(link)
        gettitle(newhtml)
        dir_name=createdir(gettitle(newhtml))
        print(dir_name)
        print("开始爬取"+gettitle(newhtml))
        for i in range(1,int(getsum(newhtml))+1):
            time.sleep(1)
            newlink=link[0:34]+"_"+str(i)+link[34:40]
            secondhtml=askurl(newlink)
            data=getimg(secondhtml)
            # print(datas)
            download(data,dir_name)
        print(gettitle(newhtml)+"爬取结束")

"""请求网页信息"""
def askurl(url):
    response=requests.get(url,headers=headers)
    html=response.text
    # print(html)
    return html

"""获取页面标题"""
def gettitle(html):
    # print(datas)
    parse=parsel.Selector(html)
    title=parse.xpath('//div[@class="ptitle"]/h1/text()').getall()[0]
    # print(title)
    return title

"""获取图片数量"""
def getsum(html):
    # print(datas)
    parse=parsel.Selector(html)
    sum=parse.xpath('//div[@class="ptitle"]/em/text()').getall()[0]
    # print(sum)
    return sum

"""获取图片链接"""
def getimg(html):
    # print(datas)
    parse=parsel.Selector(html)
    link=parse.xpath('//div[@class="pic-meinv"]//img/@url').getall()[0]
    # print(link)
    return link

"""获取页面链接"""
def getlink(html):
    # print(datas)
    parse=parsel.Selector(html)
    links=parse.xpath('//div[@class="Left_bar"]//ul/li/a/@href').getall()
    # print(links)
    return links

"""创建文件夹名称"""
def createdir(dir_name1):
    dir_name=r'D:cosplay'
    if not os.path.exists(dir_name+'./'+dir_name1):
        os.makedirs(dir_name+'./'+dir_name1)
    return dir_name+'./'+dir_name1


"""保存图片"""
def download(data,dir_name):
    time.sleep(0.25)
    file_name=data.split("/")[-1]
    response=requests.get(data,headers=headers)
    with open(dir_name+"/"+file_name,'wb') as f:
        f.write(response.content)
        print(file_name+"下载成功")



if __name__ == '__main__':
    print("主程序入口")
    main()