#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 爬取妹子图
# url:http://www.netbian.com/meinv/
# http://www.netbian.com/meinv/index_2.htm
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
import re
def main():
# 输入网址得到服务器返回的数据
allurl()
# 解析数据得到图片链接和图片名称
# 保存图片到本地,图名做相应修改
# 图片链接格式
findImg = re.compile(r'src="(.*?)"', re.S)
# 图片名称格式
findName = re.compile(r"<b>(.*?)</b>", re.S)
def findurl(url):
"""一个网页的爬取(后面用for爬取所有网页)"""
# head伪装
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/78.0.3904.108 Safari/537.36"
}
req = urllib.request.Request(url=url, headers=headers) # 发送信息的预处理
response = urllib.request.urlopen(req) # 得到整个网页
# 读取网页并解码
html = response.read().decode(encoding="gb18030") # 使用'utf-8'无法解码,换为'gb18030'
return html
def allurl():
"""循环爬取所有网页"""
for i in range(1000):
url = "http://www.netbian.com/meinv/index_" + str(i + 2) + ".htm"
html = findurl(url) # 获取一个网页
# print(html) # 测试:是否获取到网页
# 解析数据得到图片链接和图片名称
bs = BeautifulSoup(html, "html.parser") # 将网页解析为树形
t_list = bs.select("li>a") # 找到标签li中的所有子标签a,做成列表
t_list = t_list[-17:-1]
# print(t_list) # 测试:当前网页所有妹子图放入列表(每页17个)
# 对每个妹子进行正则表达式提取(链接及名称)
for item in t_list:
item = str(item) # 正则表达式是对字符串操作,所以先转化为字符串
# 提取图片名
name = re.findall(findName, item)
# 提取链接,并下载
img = re.findall(findImg, item)
savejpg(name, img)
def imgurl(url):
"""获取图片链接下载图片"""
# head伪装
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/78.0.3904.108 Safari/537.36"
}
req = urllib.request.Request(url=url, headers=headers) # 发送信息的预处理
response = urllib.request.urlopen(req) # 得到图片链接
# 二进制形式读取链接
html = response.read()
return html
def savejpg(name, img):
"""得到名字和链接存储图片"""
# print(name, img) # 测试:输出图名及对应链接
meizi = imgurl(img[0]) # 获取图片链接
with open("D:/ImageResult/{0}.jpg".format(name[0]), "wb") as f:
f.write(meizi)
if __name__ == "__main__":
# 主函数
main()