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

养成习惯,先赞后看!!

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

都看到这里了,如果觉得对你有帮助的话,可以关注博主的公众号,新人up需要你的支持。
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python爬虫中,我们可以使用XPath来提取网页中的图片链接并进行下载XPath是一种在XML和HTML文档中查找和定位元素的语言。要在Python使用XPath,我们需要使用相关的库,如lxml库或BeautifulSoup库。下面是一个示例代码,演示了如何使用XPath下载图片: ```python import requests from lxml import html # 定义目标网页的URL url = 'http://example.com' # 发送请求获取网页内容 response = requests.get(url) content = response.text # 使用lxml库解析网页内容 tree = html.fromstring(content) # 使用XPath表达式提取图片链接 image_urls = tree.xpath('//img/@src') # 遍历图片链接列表,下载图片 for image_url in image_urls: # 发送请求获取图片内容 image_response = requests.get(image_url) # 将图片保存到本地 with open('image.jpg', 'wb') as f: f.write(image_response.content) ``` 在上面的代码中,我们首先发送请求获取网页的内容,然后使用lxml库将网页内容转换为可解析的树结构。接下来,我们使用XPath表达式`//img/@src`提取所有`<img>`标签的`src`属性值,即图片链接。最后,我们遍历图片链接列表,发送请求获取图片内容,并将图片保存到本地。 请注意,上面的代码只是一个示例,具体的使用情况可能因不同的网站而有所差异。你需要根据目标网站的实际情况,调整XPath表达式和代码逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python爬虫实战之xpath解析](https://blog.csdn.net/weixin_58667126/article/details/126105955)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python3爬虫学习-爬取图片批量下载 XPATH](https://blog.csdn.net/xunxue1523/article/details/104584361)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值