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()
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MongoDB内核:副本集选举过程分析
- MongoDB内核:主从同步之源码剖析
- OpenGL ES 帧缓冲区位块传送
- OAuth 2.0 单元测试解决方案
- 「性能提升」扩展 Spring Cache 支持多级缓存
- 如何以源码形式运行Nacos Server
- Spring Boot 2.4 配置文件将加载机制大变化
- OpenGL ES 多目标渲染(MRT)
- R包:gtable包用于处理ggplot2图像
- Sight——杀手级提升Laravel开发速度的组件现在开源了!
- 面试官带你学Android——面试中Handler 这些必备知识点你都知道吗?
- leetcode哈希表之前K个高频元素
- Kali之U盘启动加密与持久化存储制作流程
- Gentoo发行版系统基础使用记录
- Ubuntu-20.04-LTS桌面版与服务器版基础初始配置