博主学习实战视频的参考教程:https://www.bilibili.com/video/av75562300?from=search&seid=10719635559175933725
视频教的不多,但足以让博主这种小白入门
下面是根据博主根据自己的理解通过python基础进一步实现自己想要的内容
后续会补充通过python函数、python面对对象去实现。
未经作者授权,禁止转载
一、环境
Python 3.7.3
requests库
谷歌浏览器-开发者版
VS CODE
二 、爬一个小姐姐当前页面图片
1.确定好我们需要爬取的网页
我选的是
网站首页链接为:https://www.vmgirls.com/
有点多,做人还是不要太贪比较好,我就选清纯少女好了
可以在浏览器地址栏拿到网址 : https://www.vmgirls.com/pure
2.获取网站的文本
新建spider_girl.py 输入以下代码
import requests url = "https://www.vmgirls.com/pure"
# 请求网页 response = requests.get(url=url)
# 查看获取文本 print(response.text)
很明显,告诉了我们被拒绝访问了,这是因为headers的原因,也可以理解为反爬吧
这个时候我们的headers为
我们只需要根据需求把需要的修改一下就可以了,我就只修改了‘User-Agent’。可以从网站中获取。在谷歌浏览器中,按F12,弹出的开发者工具
修改后的代码如下:
1 import requests 2 url = "https://www.vmgirls.com/pure" 3 header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3983.2 Safari/537.36"} 4 response = requests.get(url=url, headers=header) 5 print(response.text)
获取成功,获取的内容太多就不截图了
接下来我们需要保存获取的文本以便接下来的操作
html = response.text
3.获取指定链接
我们先只获取第一个小姐姐的照片
所以我们要先进入放置第一个小姐姐的照片的网站
右击第一个小姐姐点击检查 弹出开发者工具显示网页元素
标题对应着小姐姐的照片网址,我们需要将获取链接并保存
# 这是查询网站中所有小姐姐的地址链接,但我们目前只需要第一个
# findall中括号的内容就是我们获取的内容
import re
girl_url = re.findall('<a href="(.*?)" class="list-title text-md h-2x" target="_blank">', html) print(girl_url[0])
可以看到,获取的一模一样,成功
4.获取小姐姐的照片网站文本
girl_response = requests.get(url=girl_url[0], headers=header) print(girl_response.text)
跟上面获取操作一致
5.获取小姐姐的照片!
右击小姐姐照片,点击检查
# <a>标签很多,所以我们需要多一个alt属性和title属性确保只剩下我们需要的照片地址 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_html) print(pics) print(len(pics))
因为此页总共就只有五张小姐姐的照片,所以我们将只会有五个链接。
很明显,成功了。接下来就是保存五个小姐姐的照片了
6.保存小姐姐的图片
# 获取该网址的标题 title = re.findall('<h1 class="post-title h3">(.*?)</h1>', girl_html)[-1] # 为每一个小姐姐的照片放置好容身住处 img_file = r"./girl_img/%s" % title # 检测是否存在,如果不存在则新建 if not os.path.exists(img_file): os.mkdir(img_file) for pic in pics: pic_name = pic.split('/')[-1] pic_res = requests.get(pic) with open("%s/%s" % (img_file, pic_name), "wb") as p: p.write(pic_res.content)
运行后就可以看到目录中多了五张图片,成功
目前源代码如下:
1 import requests 2 import re 3 import os 4 url = "https://www.vmgirls.com/pure" 5 header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3983.2 Safari/537.36"} 6 response = requests.get(url=url, headers=header) 7 html = response.text 8 girl_url = re.findall('<a href="(.*?)" class="list-title text-md h-2x" target="_blank">', html) 9 girl_response = requests.get(url=girl_url[0], headers=header) 10 girl_html = girl_response.text 11 title = re.findall('<h1 class="post-title h3">(.*?)</h1>', girl_html)[-1] 12 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_html) 13 img_file = r"./girl_img/%s" % title 14 img_name = "" 15 if not os.path.exists(img_file): 16 os.mkdir(img_file) 17 for pic in pics: 18 pic_name = pic.split('/')[-1] 19 print(pic_name) 20 pic_res = requests.get(pic) 21 print(pic_res.status_code) 22 with open("%s/%s" % (img_file, pic_name), "wb") as p: 23 p.write(pic_res.content)
三、爬虫完成翻页获取
1.获取目标网址
我们可以看到,小姐姐的照片是不止当前界面的,还有第二页第三页。我们手动进入网页查看,地址栏的变化为 https://www.vmgirls.com/13506/page-2.html https://www.vmgirls.com/13506/page-3.html.....
所以我们需要把之前获取的网址的结尾修改成我们需要的来完成翻页操作继续获取
# 分页存在着多个的可能性,所以我们需要一个循环来获取所有分页图片 # 设置一个变量n,来获取每次循环的分页页码 n = 1 while n != 0: # 因为分页都是第二页起,所以先自加1 n += 1 # 修改网址为分页的网址格式,同时将变量n加入其中 girl_url_more = girl_url[0].replace(".html", "/page-%d.html" % n) girl_response = requests.get(url=girl_url_more, headers=header) # 打印网址确定跟我们想要得到的是一致,同时打印响应码来确定该网址是否成功响应 print(girl_url_more) print(girl_response.status.code)
我们可以看到在第七页时,出现了404,所以我们可以确定2-6页都是存在的且都为200,所以我们在循环中加入一个判断条件
# 当网址响应失败时,将变量n设置为0结束循环 if girl_response.status_code != 200: n = 0
2.重复之前获取图片操作
pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_response.text) for pic in pics: pic_name = pic.split('/')[-1] pic_res = requests.get(pic) with open("%s/%s" % (img_file, pic_name), "wb") as p: p.write(pic_res.content)
结果就是我们的文件夹多了好多好多张图片了!
目前源代码如下:
1 import requests 2 import re 3 import os 4 url = "https://www.vmgirls.com/pure" 5 header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3983.2 Safari/537.36"} 6 response = requests.get(url=url, headers=header) 7 html = response.text 8 girl_url = re.findall('<a href="(.*?)" class="list-title text-md h-2x" target="_blank">', html) 9 girl_response = requests.get(url=girl_url[0], headers=header) 10 girl_html = girl_response.text 11 title = re.findall('<h1 class="post-title h3">(.*?)</h1>', girl_html)[-1] 12 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_html) 13 img_file = r"./girl_img/%s" % title 14 img_name = "" 15 if not os.path.exists(img_file): 16 os.mkdir(img_file) 17 for pic in pics: 18 pic_name = pic.split('/')[-1] 19 print(pic_name) 20 pic_res = requests.get(pic) 21 print(pic_res.status_code) 22 with open("%s/%s" % (img_file, pic_name), "wb") as p: 23 p.write(pic_res.content) 24 n = 1 25 while n != 0: 26 n += 1 27 girl_url_more = girl_url[0].replace(".html", "/page-%d.html" % n) 28 girl_response = requests.get(url=girl_url_more, headers=header) 29 if girl_response.status_code != 200: 30 n = 0 31 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_response.text) 32 for pic in pics: 33 pic_name = pic.split('/')[-1] 34 pic_res = requests.get(pic) 35 with open("%s/%s" % (img_file, pic_name), "wb") as p: 36 p.write(pic_res.content)
三、爬取八个的小姐姐图片
步骤基本屎一样的,我就不123标注了。
前面8个小姐姐其实早已经安排好了。在girl_url里。我们因为前面只用一个,所以在第九行的girl_url后加了个[0]
我们只要用for循环遍历出链接即可,但获取数目过多,我们需要在过程中补充一些print来确定当前进度,以便中途出现问题我们确切知道问题在哪一个环节上
目前源代码如下:
1 import requests 2 import re 3 import os 4 url = "https://www.vmgirls.com/pure" 5 header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3983.2 Safari/537.36"} 6 response = requests.get(url=url, headers=header) 7 html = response.text 8 girl_url = re.findall('<a href="(.*?)" class="list-title text-md h-2x" target="_blank">', html) 9 for item_url in girl_url: 10 girl_response = requests.get(url=item_url, headers=header) 11 girl_html = girl_response.text 12 title = re.findall('<h1 class="post-title h3">(.*?)</h1>', girl_html)[-1] 13 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_html) 14 img_file = r"./girl_img/%s" % title 15 img_name = "" 16 if not os.path.exists(img_file): 17 os.mkdir(img_file) 18 num = 0 19 img_id = 0 20 print("-" * 20) 21 print("正在获取'%s'的照片" % title) 22 for pic in pics: 23 img_id += 1 24 pic_name = pic.split('/')[-1] 25 pic_res = requests.get(pic) 26 print("正在下载第%d张照片" % img_id) 27 with open("%s/%s" % (img_file, pic_name), "wb") as p: 28 p.write(pic_res.content) 29 print("下载成功") 30 n = 1 31 while n != 0: 32 n += 1 33 girl_url_more = item_url.replace(".html", "/page-%d.html" % n) 34 girl_response = requests.get(url=girl_url_more, headers=header) 35 if girl_response.status_code != 200: 36 n = 0 37 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_response.text) 38 for pic in pics: 39 pic_name = pic.split('/')[-1] 40 pic_res = requests.get(pic) 41 img_id += 1 42 print("正在下载第%d张照片" % img_id) 43 with open("%s/%s" % (img_file, pic_name), "wb") as p: 44 p.write(pic_res.content) 45 print("下载成功") 46 47 print("-" * 20)
进度报告部分截图:
最终结果:
成功!!