前言
一、准备工作
二、网站信息
三、项目结构
四、代码实现步骤
1.引入库
2.实现抓取网站主页源码
3.实现抓取每一图集链接
4.生成图集列表供选择下载
5.通过所选内容进行下载
6.主函数整合
五、项目实现效果
总结
前言
网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
一、准备工作
- PyCharm 2021.3.1
- Python 3.8及以上
- 了解爬虫相关基础知识(xpath、request、lxml)
二、网站信息
该网站为完全免费的个人维护网站,希望大家练习时控制访问频率,以免造成网站损失。
三、项目结构
- 获取网站主页源代码
- 分析源码得到每一图集的链接并制成列表
- 循环访问列表中的链接得到源码
- 从源码中找到下载链接
四、代码实现步骤
1.引入库
import time
import os
import requests
import random
from lxml import etree
2.实现抓取网站主页源码
def get_content(url, headers, proxies):
response = requests.get(url=url, proxies=proxies, headers=headers)
content = response.text
time.sleep(random.random() * 3)
return content
3.实现抓取每一图集链接
def get_pic_urls(content):
tree = etree.HTML(content)
pic_urls_list = tree.xpath('/html/body/div[3]/div/div[2]/div//div[@]/a/@href')
title_list = tree.xpath('/html/body/div[3]/div/div[2]/div//div[@]/a/@title')
return pic_urls_list, title_list
4.生成图集列表供选择下载
def Choosejj(title_list):
number_list, n = [], 0
print("这是本次爬取到的{}位小姐姐照片列表!".format(len(title_list)))
while n < len(title_list):
print(str(n+1) + '.' + title_list[n])
n += 1
print('请输入你要选择的小姐姐序号(输入回车结束输入):')
while True:
Q1 = input()
if Q1 != '':
if int(Q1) <= len(title_list) and int(Q1) not in number_list:
number_list.append(int(Q1))
elif int(Q1) > len(title_list) or int(Q1) <= 0:
print('对不起,先生。没有{}号小姐姐哦!'.format(int(Q1)))
elif int(Q1) in number_list:
print('先生,你已经选过这位小姐姐了哦!')
else:
break
print('先生,请稍等。这就为你下载!')
return number_list
5.通过所选内容进行下载
def download_pics(pic_urls_list, title_list, number_list, headers, proxies):
for number in number_list:
number = number - 1
pljj_pic_url = pic_urls_list[number]
response = requests.get(url=pljj_pic_url, headers=headers, proxies=proxies)
content = response.text
tree = etree.HTML(content)
img_urls = tree.xpath('/html/body/main/div/div[2]/div[1]/div/div/div[4]/div[3]/a/@href')
time.sleep(random.random() * 3)
print(img_urls)
dir_name = title_list[number]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
print('为你创建《{}》图集'.format(dir_name))
n = 1
for img_url in img_urls:
if img_url.split('.')[-1] == 'jpeg' or img_url.split('.')[-1] == 'jpg':
print('正在下载第{}张照片'.format(n))
n += 1
file_name = img_url.split('/')[-1]
response = requests.get(url=img_url, proxies=proxies, headers=headers, timeout=5)
with open(dir_name + '/' + file_name, 'wb') as f:
f.write(response.content)
time.sleep(3)
6.主函数整合
def main():
# 准备好请求头和代理池
headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)'}
proxies = {'http': '47.106.105.236:80'}
# 首先获取网页源码,返回content
url = 'https://www.vmgirls.com/'
content = get_content(url, headers, proxies)
# print(content)
# 从源码中找出每个图集的链接,返回urls
pic_urls_list, title_list = get_pic_urls(content)
# print(pic_urls_list)
# print(title_list)
number_list = Choosejj(title_list)
# 循环访问链接,下载图片
download_pics(pic_urls_list, title_list, number_list, headers, proxies)
print("下载完毕啦!")
1.引入库
import time
import os
import requests
import random
from lxml import etree
2.实现抓取网站主页源码
def get_content(url, headers, proxies):
response = requests.get(url=url, proxies=proxies, headers=headers)
content = response.text
time.sleep(random.random() * 3)
return content
3.实现抓取每一图集链接
def get_pic_urls(content):
tree = etree.HTML(content)
pic_urls_list = tree.xpath('/html/body/div[3]/div/div[2]/div//div[@]/a/@href')
title_list = tree.xpath('/html/body/div[3]/div/div[2]/div//div[@]/a/@title')
return pic_urls_list, title_list
4.生成图集列表供选择下载
def Choosejj(title_list):
number_list, n = [], 0
print("这是本次爬取到的{}位小姐姐照片列表!".format(len(title_list)))
while n < len(title_list):
print(str(n+1) + '.' + title_list[n])
n += 1
print('请输入你要选择的小姐姐序号(输入回车结束输入):')
while True:
Q1 = input()
if Q1 != '':
if int(Q1) <= len(title_list) and int(Q1) not in number_list:
number_list.append(int(Q1))
elif int(Q1) > len(title_list) or int(Q1) <= 0:
print('对不起,先生。没有{}号小姐姐哦!'.format(int(Q1)))
elif int(Q1) in number_list:
print('先生,你已经选过这位小姐姐了哦!')
else:
break
print('先生,请稍等。这就为你下载!')
return number_list
5.通过所选内容进行下载
def download_pics(pic_urls_list, title_list, number_list, headers, proxies):
for number in number_list:
number = number - 1
pljj_pic_url = pic_urls_list[number]
response = requests.get(url=pljj_pic_url, headers=headers, proxies=proxies)
content = response.text
tree = etree.HTML(content)
img_urls = tree.xpath('/html/body/main/div/div[2]/div[1]/div/div/div[4]/div[3]/a/@href')
time.sleep(random.random() * 3)
print(img_urls)
dir_name = title_list[number]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
print('为你创建《{}》图集'.format(dir_name))
n = 1
for img_url in img_urls:
if img_url.split('.')[-1] == 'jpeg' or img_url.split('.')[-1] == 'jpg':
print('正在下载第{}张照片'.format(n))
n += 1
file_name = img_url.split('/')[-1]
response = requests.get(url=img_url, proxies=proxies, headers=headers, timeout=5)
with open(dir_name + '/' + file_name, 'wb') as f:
f.write(response.content)
time.sleep(3)
6.主函数整合
def main():
# 准备好请求头和代理池
headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)'}
proxies = {'http': '47.106.105.236:80'}
# 首先获取网页源码,返回content
url = 'https://www.vmgirls.com/'
content = get_content(url, headers, proxies)
# print(content)
# 从源码中找出每个图集的链接,返回urls
pic_urls_list, title_list = get_pic_urls(content)
# print(pic_urls_list)
# print(title_list)
number_list = Choosejj(title_list)
# 循环访问链接,下载图片
download_pics(pic_urls_list, title_list, number_list, headers, proxies)
print("下载完毕啦!")
def get_content(url, headers, proxies):
response = requests.get(url=url, proxies=proxies, headers=headers)
content = response.text
time.sleep(random.random() * 3)
return content
3.实现抓取每一图集链接
def get_pic_urls(content):
tree = etree.HTML(content)
pic_urls_list = tree.xpath('/html/body/div[3]/div/div[2]/div//div[@]/a/@href')
title_list = tree.xpath('/html/body/div[3]/div/div[2]/div//div[@]/a/@title')
return pic_urls_list, title_list
4.生成图集列表供选择下载
def Choosejj(title_list):
number_list, n = [], 0
print("这是本次爬取到的{}位小姐姐照片列表!".format(len(title_list)))
while n < len(title_list):
print(str(n+1) + '.' + title_list[n])
n += 1
print('请输入你要选择的小姐姐序号(输入回车结束输入):')
while True:
Q1 = input()
if Q1 != '':
if int(Q1) <= len(title_list) and int(Q1) not in number_list:
number_list.append(int(Q1))
elif int(Q1) > len(title_list) or int(Q1) <= 0:
print('对不起,先生。没有{}号小姐姐哦!'.format(int(Q1)))
elif int(Q1) in number_list:
print('先生,你已经选过这位小姐姐了哦!')
else:
break
print('先生,请稍等。这就为你下载!')
return number_list
5.通过所选内容进行下载
def download_pics(pic_urls_list, title_list, number_list, headers, proxies):
for number in number_list:
number = number - 1
pljj_pic_url = pic_urls_list[number]
response = requests.get(url=pljj_pic_url, headers=headers, proxies=proxies)
content = response.text
tree = etree.HTML(content)
img_urls = tree.xpath('/html/body/main/div/div[2]/div[1]/div/div/div[4]/div[3]/a/@href')
time.sleep(random.random() * 3)
print(img_urls)
dir_name = title_list[number]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
print('为你创建《{}》图集'.format(dir_name))
n = 1
for img_url in img_urls:
if img_url.split('.')[-1] == 'jpeg' or img_url.split('.')[-1] == 'jpg':
print('正在下载第{}张照片'.format(n))
n += 1
file_name = img_url.split('/')[-1]
response = requests.get(url=img_url, proxies=proxies, headers=headers, timeout=5)
with open(dir_name + '/' + file_name, 'wb') as f:
f.write(response.content)
time.sleep(3)
6.主函数整合
def main():
# 准备好请求头和代理池
headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)'}
proxies = {'http': '47.106.105.236:80'}
# 首先获取网页源码,返回content
url = 'https://www.vmgirls.com/'
content = get_content(url, headers, proxies)
# print(content)
# 从源码中找出每个图集的链接,返回urls
pic_urls_list, title_list = get_pic_urls(content)
# print(pic_urls_list)
# print(title_list)
number_list = Choosejj(title_list)
# 循环访问链接,下载图片
download_pics(pic_urls_list, title_list, number_list, headers, proxies)
print("下载完毕啦!")
def Choosejj(title_list):
number_list, n = [], 0
print("这是本次爬取到的{}位小姐姐照片列表!".format(len(title_list)))
while n < len(title_list):
print(str(n+1) + '.' + title_list[n])
n += 1
print('请输入你要选择的小姐姐序号(输入回车结束输入):')
while True:
Q1 = input()
if Q1 != '':
if int(Q1) <= len(title_list) and int(Q1) not in number_list:
number_list.append(int(Q1))
elif int(Q1) > len(title_list) or int(Q1) <= 0:
print('对不起,先生。没有{}号小姐姐哦!'.format(int(Q1)))
elif int(Q1) in number_list:
print('先生,你已经选过这位小姐姐了哦!')
else:
break
print('先生,请稍等。这就为你下载!')
return number_list
5.通过所选内容进行下载
def download_pics(pic_urls_list, title_list, number_list, headers, proxies):
for number in number_list:
number = number - 1
pljj_pic_url = pic_urls_list[number]
response = requests.get(url=pljj_pic_url, headers=headers, proxies=proxies)
content = response.text
tree = etree.HTML(content)
img_urls = tree.xpath('/html/body/main/div/div[2]/div[1]/div/div/div[4]/div[3]/a/@href')
time.sleep(random.random() * 3)
print(img_urls)
dir_name = title_list[number]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
print('为你创建《{}》图集'.format(dir_name))
n = 1
for img_url in img_urls:
if img_url.split('.')[-1] == 'jpeg' or img_url.split('.')[-1] == 'jpg':
print('正在下载第{}张照片'.format(n))
n += 1
file_name = img_url.split('/')[-1]
response = requests.get(url=img_url, proxies=proxies, headers=headers, timeout=5)
with open(dir_name + '/' + file_name, 'wb') as f:
f.write(response.content)
time.sleep(3)
6.主函数整合
def main():
# 准备好请求头和代理池
headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)'}
proxies = {'http': '47.106.105.236:80'}
# 首先获取网页源码,返回content
url = 'https://www.vmgirls.com/'
content = get_content(url, headers, proxies)
# print(content)
# 从源码中找出每个图集的链接,返回urls
pic_urls_list, title_list = get_pic_urls(content)
# print(pic_urls_list)
# print(title_list)
number_list = Choosejj(title_list)
# 循环访问链接,下载图片
download_pics(pic_urls_list, title_list, number_list, headers, proxies)
print("下载完毕啦!")
6.主函数整合
def main():
# 准备好请求头和代理池
headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)'}
proxies = {'http': '47.106.105.236:80'}
# 首先获取网页源码,返回content
url = 'https://www.vmgirls.com/'
content = get_content(url, headers, proxies)
# print(content)
# 从源码中找出每个图集的链接,返回urls
pic_urls_list, title_list = get_pic_urls(content)
# print(pic_urls_list)
# print(title_list)
number_list = Choosejj(title_list)
# 循环访问链接,下载图片
download_pics(pic_urls_list, title_list, number_list, headers, proxies)
print("下载完毕啦!")
五、项目实现效果
总结
本文中的爬虫实例为初级爬虫,需要练习者了解爬虫相关的基础知识,会使用xpath方式匹配源码内容,了解request、lxml库方法的使用,能够看懂网页源码定位所需内容位置。



