python爬虫-vmgirls-正则表达式
概述
本次爬虫任务是爬取图片网站图片,网址是https://www.vmgirls.com/
分析网页
第一步,打开需要爬取的页面https://www.vmgirls.com/13344.html
打开F12,随便选择一张图片查看图片,操作如下
第二步,寻找所需下载图片的地址,并分析最优的方式
第三步,得出结论,可以通过获取每张图片的url地址,进行保存图片的动作
代码操作
请求网页
第一步,我们请求网页并打印网页返回的请求
import requests
'''请求网页'''
response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#请求网址并得到一个回复
print(response.text)
发现出现403 Forbidden,我们需要寻找原因
# <html>
# <head><title>403 Forbidden</title></head>
# <body>
# <center><h1>403 Forbidden</h1></center>
# <hr><center>Her</center>
# </body>
# </html>
我们插入一个代码
print(response.request.headers)
发现问题所在,网页返回的信息中表示,我们发送的请求来源于一个爬虫程序,所以我们需要伪装一个header,
# {'User-Agent': 'python-requests/2.23.0',
# 'Accept-Encoding': 'gzip, deflate',
# 'Accept': '*/*',
# 'Connection': 'keep-alive'}
怎么做,打开浏览器,指定网页,F12查看浏览器发送的headers
复制heades到代码中
import requests
'''请求网页'''
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
} response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#请求网址并得到一个回复
print(response.text)
print(response.request.headers)
能够正常得到网页返回的信息了
解析网页
解析网页本次使用正则表达式
导入re库
import re urls = re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html)
print(urls)
得到5个图片的url链接
['https://static.vmgirls.com/image/2019/12/2019122210292813-scaled.jpeg',
'https://static.vmgirls.com/image/2019/12/2019122210294290-scaled.jpeg',
'https://static.vmgirls.com/image/2019/12/2019122210295639-scaled.jpeg',
'https://static.vmgirls.com/image/2019/12/2019122210300913-scaled.jpeg',
'https://static.vmgirls.com/image/2019/12/2019122210301954-scaled.jpeg']
保存图片
将所有的图片保存为文件格式
for url in urls:
response = requests.get(url, headers=headers)
# 将url中后面的数字字段截取出来作为图片的文件名
file_name = url.split('/')[-1]
# 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
with open(file_name,'wb') as f:
# 文件写入每一个response返回的内容,最终保存的即为图片,图片地址在该py文件相同目录
f.write(response.content)
此时需要考虑到两个问题
1.访问频次
2.文件应该需要保存在但个文件夹中,问不是散乱的存放
修改代码如下
import os
# 获得文件夹名
dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>', html)[-1]
# 判断文件夹是否存在,并创建文件夹
if not os.path.exists(dir_name):
os.makedirs(dir_name)
# 遍历所有的url,将所有的url单独保存
for url in urls: # 放置访问频次太高,设置访问频率,需要导入time模块
time.sleep(1)
response = requests.get(url, headers=headers)
# 将url中后面的数字字段截取出来作为图片的文件名
file_name = url.split('/')[-1] # 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
# 由于加入了文件夹的步骤,所以with open(file_path,wb)as f中file_path需要带上文件夹
# with open(file_name,'wb') as f:
with open(dir_name+'/'+file_name, 'wb') as f:
# 文件写入每一个response返回的内容,最终保存的即为图片,图片地址在该py文件相同目录
f.write(response.content) # 由于这种方式文件是一个个单独的存放在目录下面,并没有较好的分类,我们需要加入一个分类的步骤
# 根据网页中的名称设置文件夹名为dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>')[-1]
# 若想创建文件夹,需要导入os库
# 判断文件夹是否存在
任务完成
完整代码
import requests
import re
import time
import os '''请求网页''' headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
} response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#请求网址并得到一个回复
html = response.text """
print(response.text) # <html>
# <head><title>403 Forbidden</title></head>
# <body>
# <center><h1>403 Forbidden</h1></center>
# <hr><center>Her</center>
# </body>
# </html> # 发现了403 Forbidden,也就是这个系统设置了反爬虫,所以需要改变
# 我们查看一下返回的headers,也就是请求的头信息 print(response.request.headers) # {'User-Agent': 'python-requests/2.23.0',
# 'Accept-Encoding': 'gzip, deflate',
# 'Accept': '*/*',
# 'Connection': 'keep-alive'} # 发现这是用python端请求,理所当然的被网页拒绝了,所以我们需要一个伪装的headers,伪装成浏览器发送的请求
# 怎么做,打开浏览器,指定网页,F12查看浏览器发送的headers
# {user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36} # 制作伪装的headers
# headers = {'user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
# 注意headers是一个字典,不是字符串,所以格式为"user-agent":"头部具体信息" # 将headers放置到网页请求的前面,即response前
# 同时response里面带上headers
# 程序运行之后发现可以正常运行 """ '''解析网页''' # 解析网页本次使用正则表达式
# 导入re库 # 获得文件夹名
dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>', html)[-1]
# 判断文件夹是否存在,并创建文件夹
if not os.path.exists(dir_name):
os.makedirs(dir_name) # 获得所有图片的url链接
urls = re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html)
print(urls) """保存图片""" # 遍历所有的url,将所有的url单独保存
for url in urls: # 放置访问频次太高,设置访问频率,需要导入time模块
time.sleep(1)
response = requests.get(url, headers=headers)
# 将url中后面的数字字段截取出来作为图片的文件名
file_name = url.split('/')[-1] # 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
# 由于加入了文件夹的步骤,所以with open(file_path,wb)as f中file_path需要带上文件夹
# with open(file_name,'wb') as f:
with open(dir_name+'/'+file_name, 'wb') as f:
# 文件写入每一个response返回的内容,最终保存的即为图片,图片地址在该py文件相同目录
f.write(response.content) # 由于这种方式文件是一个个单独的存放在目录下面,并没有较好的分类,我们需要加入一个分类的步骤
# 根据网页中的名称设置文件夹名为dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>')[-1]
# 若想创建文件夹,需要导入os库
# 判断文件夹是否存在
图片结果
python爬虫-vmgirls-正则表达式的更多相关文章
- 玩转python爬虫之正则表达式
玩转python爬虫之正则表达式 这篇文章主要介绍了python爬虫的正则表达式,正则表达式在Python爬虫是必不可少的神兵利器,本文整理了Python中的正则表达式的相关内容,感兴趣的小伙伴们可以 ...
- 【Python爬虫】正则表达式与re模块
正则表达式与re模块 阅读目录 在线正则表达式测试 常见匹配模式 re.match re.search re.findall re.compile 实战练习 在线正则表达式测试 http://tool ...
- python 爬虫之-- 正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. 正则表达式非python独有,python 提供了正则表达式的接口,re模块 一.正则匹配字符简介 模式 描述 \d ...
- python爬虫训练——正则表达式+BeautifulSoup爬图片
这次练习爬 传送门 这贴吧里的美食图片. 如果通过img标签和class属性的话,用BeautifulSoup能很简单的解决,但是这次用一下正则表达式,我这也是参考了该博主的博文:传送门 所有图片的s ...
- 【python爬虫和正则表达式】爬取表格中的的二级链接
开始进公司实习的一个任务是整理一个网页页面上二级链接的内容整理到EXCEL中,这项工作把我头都搞大了,整理了好几天,实习生就是端茶送水的.前段时间学了爬虫,于是我想能不能用python写一个爬虫一个个 ...
- Python爬虫运用正则表达式
我看到最近几部电影很火,查了一下猫眼电影上的数据,发现还有个榜单,里面有各种经典和热映电影的排行榜,然后我觉得电影封面图还挺好看的,想着一张一张下载真是费时费力,于是突发奇想,好像可以用一下最近学的东 ...
- Python爬虫之正则表达式(3)
# re.sub # 替换字符串中每一个匹配的子串后返回替换后的字符串 import re content = 'Extra strings Hello 1234567 World_This is a ...
- Python爬虫之正则表达式(1)
廖雪峰正则表达式学习笔记 1:用\d可以匹配一个数字:用\w可以匹配一个字母或数字: '00\d' 可以匹配‘007’,但是无法匹配‘00A’; ‘\d\d\d’可以匹配‘010’: ‘\w\w\d’ ...
- python爬虫之正则表达式
一.简介 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念 ...
- Python爬虫基础——正则表达式
说到爬虫,不可避免的会牵涉到正则表达式. 因为你需要清晰地知道你需要爬取什么信息?它们有什么共同点?可以怎么去表示它们? 而这些,都需要我们熟悉正则表达,才能更好地去提取. 先简单复习一下各表达式所代 ...
随机推荐
- ios快捷指令编程尝试
最近,,,啊好几个月了,发现这个ios的快捷指令很好玩 原生就提供了不少功能 用来练习编程思维是十分有用啊...) 其次呢,还可以使用外接的功能对原有的功能进行拓展,比如api借口啊,ssh执行程序啊 ...
- [PHP][thinkphp5] 学习三:函数助手实例说明
来源:http://blog.csdn.net/lunsunhuan1825/article/details/71086487 load_trait:快速导入Traits,PHP5.5以上无需调用 / ...
- 使用STM8S i2c对TPS65987寄存器进行读写
上图是TPS65987的i2c读写协议,和标准i2c协议有点出入,不过也不难理解,在读的时候i2c slave在发送数据过来之前会先发送1byte数据表示后面会有几个字节数据过来,在写的时候i2c h ...
- 通达OA-2017版本漏洞复现
搭建环境 服务器 虚拟机系统版本:Windows Server 2016. 安装服务端 1.下载安装程序 这里我们下载的是2017版本的通达OA服务端: 2.安装程序 配置服务: 漏洞复现 1.任意文 ...
- JDK11的重要新特性
文章目录 JDK11发布啦 Oracle不再提供JRE和Server JRE下载 删除部署工具 JavaFX不再包含在JDK中 删除Java EE和CORBA模块 JDK11发布啦 JDK11 在20 ...
- 【JAVA基础】10 Object类
1. Object类概述 是类层次结构的根类 每个类都使用 Object 作为超类 所有类都直接或者间接的继承自该类 所有对象(包括数组)都实现这个类的方法. 2. Object的构造方法 publi ...
- PostgreSQL 10.0 preview 性能增强 - 分区表性能增强(plan阶段加速)
标签 PostgreSQL , 10.0 , 分区表 , 子表 , 元信息搜索性能增强 背景 PostgreSQL 10.0 增强了分区表的子表搜索性能,对于涉及分区表包含子表特别多的QUERY,可以 ...
- LightOJ 1287 Where to Run(期望)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1287 题意:给定一个n个点的无向图(0到n-1),你开始在0.你开始遍历这个图 ...
- 虚拟化VMware之虚拟机备份(1)
之虚拟机备份() 模版:是一种开放,公用.安全的虚拟机压缩格式,通常使用的是扩展名为.ova可以在多个主流虚拟化平台下进行操作 是和 通过技术协作推出的基于磁盘的备份和恢复的新一代解决方案,可靠且易部 ...
- linux-网络管理(常用命令)
网络查看 ifconfig : 查看与临时配置网络 ifdown 网卡设备名 : 关闭网卡 ifup 网卡设备名 : 启用网卡 netstat 网络状态查询 -t 列出TCP协议端口 -u 列出UDP ...