python爬虫---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()

都看到这里,如果觉得可以的话,可以关注博主的b站号,新人up需要你的支持。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lovely__RR/article/details/107975086
今日推荐