养成习惯,先赞后看!!!
不用于任何商业价值,只是自己娱乐。
否则 爬虫爬的好,牢饭吃到饱。
这是我们这次爬取的网址:https://www.vmgirls.com/

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:101677771

爬取并下载唯美女生

1.准备工作

这次我们主要运用四个模块分别是

BeautifulSoup:主要用于我们来分析网页信息
requests:主要是用于我们来请求网页
re:正则表达式,帮组我们来匹配实际需要的信息
os:主要负责帮我们下载图片

2.分析网页+实际操作

一开始我们先分析单个页面进行爬取下载,之后我们在分析首页获取到所有页面的链接,最后对我们之前的代码进行整合规范化。

2.1分析页面1

页面网址:https://www.vmgirls.com/9384.html

我们通过鼠标定位到我们需要爬取的图片的信息就在上图红色方框中,并且通过观察页面的格式我们发现大体格式基本一样,基本都是下面这种样式:

<img alt="酸酸的,甜甜的-唯美女生" width="2904" height="4356"
class="alignnone size-full loaded"
data-src="data:image/2018/08/2018-08-10_13-52-47.jpg"
data-nclazyload="true" data-pagespeed-url-hash="1859759222"
onload="pagespeed.CriticalImages.checkImageForCriticality(this);"
data-pagespeed-lsc-url="https://www.vmgirls.com/image/2018/08/2018-08-10_13-52-47.jpg"
src="data:image/2018/08/2018-08-10_13-52-47.jpg" data-was-processed="true">

并且通过分析我们可以得到图片的链接其实就在img的data-pagespeed-lsc-url属性之中,那么我们就来尝试先将所有的img空间爬取下来

import requests
from bs4 import BeautifulSoup 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('https://www.vmgirls.com/9384.html',headers=headers)
html=response.text """解析网页"""
findImgsrc=re.compile(r'data-src="(.*?)"')
soup = BeautifulSoup(html, "html.parser") for item in soup.find_all("img", class_="alignnone size-full"):
print(item)

但是当我们爬取下来之后发现img控件中并没有data-pagespeed-lsc-url这个属性,那么我们怎么办呢?别急继续看我们发现虽然没有data-pagespeed-lsc-url但是data-src属性和data-pagespeed-lsc-url也差不多,只是缺少了部分请求头,这个我们完全可以通过后续的字符串操作进行修改得到,所以我们编写正则表达式进行匹配获取到我们需要的信息

findImgsrc=re.compile(r'data-src="(.*?)"')

就这简单一句就行了,获取到了还不行,因为他还不符合我们图片链接的规范,所以我们还需要对该字符进行处理。

datas = []
for item in soup.find_all("img", class_="alignnone size-full"):
print(item)
item = str(item)
link = re.findall(findImgsrc, item)[0]
datas.append("https://www.vmgirls.com/"+link[0:38])

  • 们便能够获取到该页面所有的图片链接了
    获取到图片链接之后我们就需要来下载图片,这里我们主要运用的就是os模块
"""创建文件夹名称"""
dir_name=re.findall('<h1 class="post-title h3">(.*?)</h1>',html)[0]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
print(dir_name) """保存图片"""
for data in datas:
# 图片名称
time.sleep(0.5)
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+"下载成功")

到此我们的第一个页面就分析结束了

2.2分析页面2

页面网址:https://www.vmgirls.com/12985.html
按道理其实每个页面的布局以及设计基本上都应该是一样的,但是这个网站有点奇怪。他的页面之间有一些不同像下面这个:
可能乍看上去大家觉得可能是一样的,但是通过对比图大家就能看出来了
我选择的另一种方式就是直接通过他的a标签来获取图片的链接,我们分析它的a标签的结构,设计下面的正则表达式来进行匹配:

re.findall('<a href="(.*?)" alt=".*?" title=".*?">',html)

接下来我们爬取看看是不是我们需要的

for item in re.findall('<a href="(.*?)" alt=".*?" title=".*?">',html):
print(item)

显然爬出来的和上述的情况一样,我们还需要为他添加请求头

for item in re.findall('<a href="(.*?)" alt=".*?" title=".*?">',html):
print("https://www.vmgirls.com/" + item)

这样我们再看看如何
这样就已经变成链接了。
到这里第二个页面我们也已经分析完毕了。

2.3分析首页

如果只是单个页面的爬取,显然还是不能满足博主,毕竟只有一个小姐姐。博主我选择
那么既然这样我们就需要来分析首页的网页结构,但是看完首页的网页结构,我们发现

他整个页面上并不存在任何分页的控件,所以像之前豆瓣那样的爬取是不行了,接着我们看
这里不就是我们需要的链接,所以我们可以分析整个网页,将他所有的链接全部保存下来,之后我们再去一个一个访问不就行了

"""解析网页获取到所有页面的URL"""
def getlink(html):
soup = BeautifulSoup(html, "html.parser")
datas = []
for item in soup.find_all("a", class_="media-content"):
item = str(item)
//判断是否含有元素
if len(re.findall(findLink, item))!=0:
link = re.findall(findLink, item)[0]
//重新构造成我们需要的网页链接
newlink="https://www.vmgirls.com/" + link
//并且进行去重操作
if newlink not in datas:
datas.append(newlink)

之后我们来看结果
这样我们就爬取到了页面上的所有网址链接了。

2.4整合代码,准备起飞

上面的准备工作已经全部完成了,接下来我们就将各个模块的代码进行封装,方便我们调用,并且使代码更加的规范化。
8月13日更新一次代码,由于之前的请求头模拟的不够彻底,导致网站认定我们是爬虫,下载能下载,但是会出现图片打不开的情况,所以添加了部分请求头的信息
8月25日更新一次代码,原因还是上面的原因,这次主要是针对请求头中的COOKIE数据,建议做好复制浏览器中自己的cookie,并且主要是针对下载文件时请求网页的请求头
整体流程;
1.获取首页的所有页面链接

"""解析网页获取到所有页面的URL"""
def getlink(html):
soup = BeautifulSoup(html, "html.parser")
datas = []
for item in soup.find_all("a", class_="media-content"):
item = str(item)
if len(re.findall(findLink, item))!=0:
link = re.findall(findLink, item)[0]
newlink="https://www.vmgirls.com/" + link
if newlink not in datas:
datas.append(newlink)
# print(datas)
return datas

2.循环爬取各个页面的图片链接

"""解析网页获取到该页面的所有图片链接"""
def getdata(html):
soup = BeautifulSoup(html, "html.parser")
datas = []
for item in soup.find_all("img", class_="alignnone size-full"):
# print(item)
item = str(item)
link = re.findall(findImgsrc, item)[0]
datas.append("https://www.vmgirls.com/" + link[0:38]) for item in re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html):
# print(item)
datas.append("https://www.vmgirls.com/" + item)
# print(datas)
return datas

3.根据链接创建相应的文件夹

"""创建文件夹名称"""
def createdir(html):
dir_name=re.findall('<h1 class="post-title h3">(.*?)</h1>',html)[0]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
return dir_name

4.在相应的文件夹中下载图片

"""保存图片"""
def download(datas,dir_name):
for data in datas:
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+"下载成功")

修改后的完整代码:

import time
import requests
import re
from bs4 import BeautifulSoup
import os findImgsrc=re.compile(r'data-src="(.*?)"')
findLink=re.compile(r'href="(.*?)"')
headers={
"cookie": "_ga=GA1.2.1285440638.1596454858; verynginx_sign_javascript=9afce94d2a1677e47daf110997b372be; _gid=GA1.2.2085095474.1597149513; xcat_sign_cookie=2bf90ba8c55955f8cb9db86e256cf3f6; Hm_lvt_a5eba7a40c339f057e1c5b5ac4ab4cc9=1597149513,1597193455,1597218065,1597295111; _GPSLSC=; Hm_lpvt_a5eba7a40c339f057e1c5b5ac4ab4cc9=1597308777",
"if-none-match": 'W/"5dff458a-212202"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}
headers2={
"cookie": "_ga=GA1.2.1285440638.1596454858; verynginx_sign_javascript=9afce94d2a1677e47daf110997b372be; xcat_sign_cookie=cfd666fa7ecf4e4a515ba54ea928d4b9; Hm_lvt_a5eba7a40c339f057e1c5b5ac4ab4cc9=1597218065,1597295111,1597374224,1598267245; _gid=GA1.2.1757491204.1598267245; _GPSLSC=; Hm_lpvt_a5eba7a40c339f057e1c5b5ac4ab4cc9=1598267370",
"if-none-match": 'W/"5dff458a-212202"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36",} def main():
print("主程序入口")
urls = getlink(askURL('https://www.vmgirls.com/'))
# print(urls)
for url in urls:
html = askURL(url)
dir_name = createdir(html)
print("开始爬取" + dir_name)
data = getdata(html)
# print(data)
download(data, dir_name)
print(dir_name + "已经下载完毕") """请求网页信息"""
def askURL(url):
response=requests.get(url,headers=headers)
html=response.text
return html
# print(html) """解析网页获取到该页面的所有图片链接"""
def getdata(html):
soup = BeautifulSoup(html, "html.parser")
datas = []
for item in soup.find_all("img", class_="alignnone size-full"):
# print(item)
item = str(item)
link = re.findall(findImgsrc, item)[0]
datas.append("https://www.vmgirls.com/" + link[0:38]) for item in re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html):
# print(item)
datas.append("https://www.vmgirls.com/" + item)
# print(datas)
return datas """解析网页获取到所有页面的URL"""
def getlink(html):
soup = BeautifulSoup(html, "html.parser")
datas = []
for item in soup.find_all("a", class_="media-content"):
item = str(item)
if len(re.findall(findLink, item))!=0:
link = re.findall(findLink, item)[0]
newlink="https://www.vmgirls.com/" + link
if newlink not in datas:
datas.append(newlink)
# print(datas)
return datas """创建文件夹名称"""
def createdir(html):
dir_name=re.findall('<h1 class="post-title h3">(.*?)</h1>',html)[0]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
return dir_name """保存图片"""
def download(datas,dir_name):
for data in datas:
time.sleep(1)
file_name=data.split("/")[-1]
# print(data)
response=requests.get(data,headers=headers2)
with open(dir_name+'/'+file_name,'wb') as f:
f.write(response.content)
print(file_name+"下载成功") if __name__ == '__main__':
main()
# init_db("movietest.db")
print("爬取完毕")

3.效果展示

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

要不是真的喜欢学技术,谁会来用Python爬小姐姐啊的更多相关文章

  1. 工作8年对技术学习过程的一些 总结 与 感悟 为什么有时迷茫、无奈 学习编程语言的最高境界最重要的是编程思想 T 字发展 学技术忌讳”什么都会“ 每天进步一点等式图 时间管理矩阵

    工作这些年对技术学习过程的一些 总结 与 感悟(一) 引言 工作了8年,一路走来总有些感触时不时的浮现在脑海中.写下来留个痕迹,也顺便给大家一点参考.希望能给初学者一点帮助. 入门 进入计算机行业,起 ...

  2. 《学技术练英语》PPT分享

    之前做的一个PPT,分享给博客园的同学. 下载地址: 学技术练英语.pdf 技术是靠自己去学的,学技术不能仅仅是看书看博客,最好是有实践,不管是做实验去验证,还是写各种代码去玩各种特性,还是造轮子都是 ...

  3. MIP技术进展月报第3期:MIP小姐姐听说,你想改改MIP官网?

    一. 官网文档全部开源 MIP 是一项永久的开源的项目,提供持续优化的解决方案,当然官网也不能例外.从现在开始,任何人都可以在 MIP 官网贡献文档啦! GitHub 上,我们已经上传了 <官网 ...

  4. 小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码)

    小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码) Python 被称为是最接近 AI 的语言.最近一位名叫Anna-Lena Popkes的小姐姐在GitHub上分享了自己如何使用P ...

  5. WebGL小姐姐教我学画画之起手式

    初次接触WebGL,如有错误之处欢迎留言,共同学习进步. v WebGL的自画像 我,WebGL,全名Web Graphics Library,是为了让死宅程序猿们(摊手)能在浏览器上为所欲为的画女朋 ...

  6. <小白学技术>将python脚本导出为exe可执行程序

    1.简介(为啥需要导出为exe可执行程序) python写完的程序靠命令来执行,显得太专业,不符合python简单的特点(好吧,主要是太low) 代码给别人执行,别人没有你的python库也没法用(双 ...

  7. 国外线下技术俱乐部建设(1) - Belgrade Python技术俱乐部2019-01-25活动感悟

    这是<国外线下技术俱乐部建设>系列文章之一.   虽然之前接触过Belgrade的.NET技术俱乐部,但是它最近活动要春节后了. 出于观摩别人是怎么搞线下社区的心态,还有自己也有在用Pyt ...

  8. python学完可以做什么?Python就业方向最全面的解析

    乔布斯说过:“每一个人都应该学习如何编程,因为编程会教会你如何思考.”下一个时代是人机交互的时代,学习编程不是要让你成为程序员,而让你理解这个时代. 点击免费领取:全网最全python学习导图+14张 ...

  9. 无语——真的好用到不行的7个Python小技巧

    本文总结了我几个我在学习python过程中,用到的几个超好用的操作,这里分享给大家,我相信你们也会非常喜欢,目录如下.这里提前索要再看,记得点一点再看哦.这只是其中一些技巧,以后会慢慢和大家分享. 1 ...

随机推荐

  1. ubuntu18.04右键怎么添加新建空白文本文件

    安装好ubuntu18.04发现右键菜单中没有新建空白文件了,这样工作的时候需要创建文本文件就不是很方便了,这里我们就可以通过以下的方式把新建空白文件添加到右键 解决办法: 1.打开文件夹,在用户主目 ...

  2. .net core下获取自身服务器地址

    网上的例子千篇一律都是Request.HttpContext.Connect.Connection.XX这种 或者依赖于IHttpContextAccessor的 而我的场景是在非控制器流程获取自身服 ...

  3. linux查询操作系统信息,CPU物理个数,CPU核心数,逻辑CPU数,内存信息查询,硬盘信息查询

    目录 一.前言 二.关于服务器基本配置 2.1 操作系统基本配置查询 2.2 CPU基本配置查询 2.3 内存基本配置查询 2.4 硬盘基本配置查询 一.前言 ​ 当我们接手了一台或者几台服务器的时候 ...

  4. ios textView跟随键盘的移动

    实现效果: textview 能够跟随键盘的移动而移动 效果图如下: 下边贴上主要的代码: 1.创建textview @interface ViewController ()<UITextVie ...

  5. “随手记”开发记录day08

    今天完成了关于统计页面中的关于每月支出和每月收入的页面

  6. 如何将ppt演示文稿上传到微信公众号?

    如何将ppt演示文稿上传到微信公众号? 我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. 以下 ...

  7. 极简 Node.js 入门 - 1.4 NPM & package.json

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  8. AutoUpdater迁移到Github

    一. 摘要 最近一两年在做跨平台的解决方案,使应用程序能支持Android, iOS, Windows, MacOs. Linux等操作系统,在Android, iOS上可以使用Google Play ...

  9. RoBERTa:一个调到最优参的BERT

    RoBERTa: A Robustly Optimized BERT Pretraining Approach. Yinhan Liu, Myle Ott, Naman Goyal, et al. 2 ...

  10. 单元测试新方法:用setUp方法 @Before注释

    public class CentralizedPUDMatchServicePacTest { PacMatchService pacMatchService; @Before public voi ...