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()
- 自相矛盾:一个进程可以自成死锁么?
- 数据库安全·开发加密插件
- wordpress无法安装这个包。: PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file 'C:WINDOWSTEMP/wordpress-4.
- 数据库安全·数据加密
- Medium网友开发了一款应用程序 让学习算法和数据结构变得更有趣
- 数据库安全·Token 认证
- 数据库安全·用户/角色认证
- 防止在训练模型时信息丢失 用于TensorFlow、Keras和PyTorch的检查点教程
- 帝国cms如何调用栏目别名作为分类标题?[!--classname--]标签不能用
- 高级软件工程师(面试题)
- 高级软件工程师 2016-9月更新
- Httpclient 调用 HTTPS 加密通道的Restful服务
- 使用 Jersey 调用 Restful 服务
- 【学术】将吴恩达的第一个深度神经网络应用于泰坦尼克生存数据集
- 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 数组属性和方法
- JavaSE语法
- 链表:听说过两天反转链表又写不出来了?
- 汇总:MySQL 8.0 运维便捷命令
- 链表:一道题目考察了常见的五个操作!
- 性能测试必备知识(11)- 怎么理解内存中的Buffer和Cache?
- 神经网络-感知器(二):Python代码实现
- Kylin、Druid、ClickHouse 核心技术对比
- 在线教育系统开发中,如何实现作业功能字体自定义?
- 保护模式第六讲-IDT表-中断门 陷阱门 任务门
- 跟牛老师一起学WEBGIS——GIS基础(QGIS中数据的创建与编辑)
- Qt信号与槽使用方法最完整总结
- 玩转 PhpStorm 系列(十二):单元测试篇
- 使用Notepad++代替笨拙的Arduino IDE
- mimikatz的使用
- Arduino数字引脚作为GPIO的使用