文章目录
前言
今天刚好有个朋友托我写一个脚本,需求是爬取他刚看的一部动漫的剧照,于是我就开始着手满足他这个需求哈哈哈~因为这个脚本涉及到一些批量拿站也会用到的模块,所以就归类到Python渗透编程里了,我会分3步简要的说一下这个脚本的编写思路。
第一步:整合URL
我首先看了一下网站的URL结构,这种爬图的活儿有点像套娃,需要一层一层的去进行数据清洗,直到得到真正的地址.jpg
其实脚本很好理解,需要你掌握Python的正则,我这里有本详细的Python正则等待你的查收!
Python正则武林秘籍
这里还需要翻页,所以要做两个正则,分两次for循环传递
右键去看一下源码,构思一下正则
这样第一步的代码就出来了:
#get_num()的作用是整合裤袜视界全部图片的url
def get_num(url1):
url = 'https://movie.douban.com/subject/30419644/photos?type=S'
req = requests.get(url=url,headers=header)
html = req.text
page = re.findall(r'<a href=\"https://movie\.douban\.com/photos/photo/(.*?)\">',html)
pages = re.findall(r'<a href=\"(.*?)\" >\d</a>',html)
# 这里过滤一下需要跳转的页面的url,传给turn_page()进行处理
for j in pages:
turn_page(j)
#在这里把过滤出来的url列表赋值给i,拼接后传递给函数get_img_url()
for i in page:
url2 = url1+i
get_img_url(url2)
这是自动翻页的代码:
# 这里获取翻页的url并进行二次处理
def turn_page(page):
host = 'https://movie.douban.com/photos/photo/'
url = page
req = requests.get(url=url,headers=header)
html = req.text
pages = re.findall(r'<a href=\"https://movie\.douban\.com/photos/photo/(.*?)\">',html)
for j in pages:
url2 = host+j
get_img_url(url2)
第二步:过滤URL
整合完url后,点进去发现还需要再深入的整合一遍
于是再一次的去构造正则
第三段代码:
#这里做了一次数据清洗,从传递过来的url中爬取图片的真实url
def get_img_url(url2):
req = requests.get(url=url2,headers=header)
html = req.text
url = re.findall(r'<img src=\"(.*?)\" width=\"686\" />',html)
down_img(url)
第三步:批量下载图片
这里经过最终的过滤后,获取到真正的图片.jpg,下载,收工!
# 最后把处理好的url,再进行一次清洗,得到真正的图片地址~
def down_img(url3):
# 用for循环接收传递过来的url列表
for img_url in url3:
req = requests.get(url=img_url,headers=header)
img = req.content
img_url = img_url
# 这里为了避免图片因重名而覆盖,采用split()方式分割取值来命名
img_name = img_url.split('/')[-1]
local_name = '/'+'Pantyhose'+'/'+img_name
# 这里就开始下载了~最后为了避免被封IP,sleep了一下
with open(local_name,'wb') as f:
print '正在下载{}......'.format(local_name)
f.write(img)
print '下载完毕,请查看!'
time.sleep(3)
完整代码
注:这里的解释器是Python2.7,不是3.8,用Python3的同学得改一下代码!
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/10/13 16:50
# @Author : Shadow
# @Site :
# @File : Panty_hose.py
# @Software: PyCharm
# 建议从底部开始食用
import requests
import re
import os
import time
# 最后把处理好的url,再进行一次清洗,得到真正的图片地址~
def down_img(url3):
# 用for循环接收传递过来的url列表
for img_url in url3:
req = requests.get(url=img_url,headers=header)
img = req.content
img_url = img_url
# 这里为了避免图片因重名而覆盖,采用split()方式分割取值来命名
img_name = img_url.split('/')[-1]
local_name = '/'+'Pantyhose'+'/'+img_name
# 这里就开始下载了~最后为了避免被封IP,sleep了一下
with open(local_name,'wb') as f:
print '正在下载{}......'.format(local_name)
f.write(img)
print '下载完毕,请查看!'
time.sleep(3)
# 这里做了一次数据清洗,从传递过来的url中爬取图片的真实url
def get_img_url(url2):
req = requests.get(url=url2,headers=header)
html = req.text
url = re.findall(r'<img src=\"(.*?)\" width=\"686\" />',html)
down_img(url)
# 这里获取翻页的url并进行二次处理
def turn_page(page):
host = 'https://movie.douban.com/photos/photo/'
url = page
req = requests.get(url=url,headers=header)
html = req.text
pages = re.findall(r'<a href=\"https://movie\.douban\.com/photos/photo/(.*?)\">',html)
for j in pages:
url2 = host+j
get_img_url(url2)
# get_num()的作用是整合裤袜视界全部图片的url
def get_num(url1):
url = 'https://movie.douban.com/subject/30419644/photos?type=S'
req = requests.get(url=url,headers=header)
html = req.text
page = re.findall(r'<a href=\"https://movie\.douban\.com/photos/photo/(.*?)\">',html)
pages = re.findall(r'<a href=\"(.*?)\" >\d</a>',html)
# 这里过滤一下需要跳转的页面的url,传给turn_page()进行处理
for j in pages:
turn_page(j)
# 在这里把过滤出来的url列表赋值给i,拼接后传递给函数get_img_url()
for i in page:
url2 = url1+i
get_img_url(url2)
if __name__=='__main__':
# 定义请求头
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
# 定义图片存放目录
dir = 'D:\Pantyhose'
# 测试D盘是否已存在目录Pantyhose,若不存在则创建
try:
print '正在测试文件目录状态......'
mkdir = os.mkdir(dir)
if mkdir is False:
print '已为您创建图片目录:' + dir
# 若存在则输出路径
except WindowsError:
print '目录已存在:' + dir
# 给老子爬!
get_num('https://movie.douban.com/photos/photo/')