# -*- coding: utf-8 -*-
#coding=utf-8
#_author_='Lucky';
#date: 2018/12/19
import os
import re
import requests
from lxml import etree
from bs4 import BeautifulSoup
def get_main():# 定义最外层的函数
for result in range(200):# 因为目录有 175 页, 所以定义这个区间
if result ==0:
url = f"http://www.mm131.com/xinggan"
else:
url = f"http://www.mm131.com/xinggan/list_6_{result}.html"# 发现规律地址都是后面加_数字
res = requests.get(url)# 请求上面网址返回给变量 res
print(res)
res.encoding = res.apparent_encoding # 将变量进行编码转换 没有实际意义
soup = BeautifulSoup(res.text, "lxml") # 解析后的内容给 soup 对象
tr_soup = soup.find_all("dd")# 发现目录主图都是在 dd 标签下面
# print(tr_soup)
get_url(tr_soup,result)# 调用下面的函数 传的参数是上面筛选出来的 dd 标签中的内容
def get_url(defaul,res):# 目录中的二层 url 地址生成
for i in defaul:
if i.find("a"):# 查找 a 标签下的所有内容
text = i.get_text()# 如果找到就提取文本到前面变量
print(text)
link = i.find("a").get("href")# 将标签 a 下面 href 的值 url 单独给变量 link 列表
print(link)
if 'html' in link:# 尤其注意这里, 为了防止爬到的地址不存在 HTML 字符串,(也就是说爬的地址不是图片 url 地址) 加次条件
link_re = '/.+?\.' # 先定义个正则表达式, 为了后面做 url 拼接使用, 实际是找出这个表达式的值
end_link = re.compile(link_re) # 编译上面的表达式后才能被 python 识别
end_url = re.findall(end_link, link) # 找出 link 中符合正则表达的内容
print('end_url=', end_url)
new = end_url[1].strip('.') # end_url[1] 的值中有个. 在拼接 url 时无法拼接, 故用 strip 删除
for num in range(2, 55): # 每个目录下基本上都是存在 55 个子图片, 故用区间
end2_link = new + '_%d' % num # 字符串拼接
web = ('http://www.mm131.com' + end2_link + '.html') # 形成要访问的 url
print(Web)
get_endurl(Web, num, text)
def get_endurl(Web, no, text):# 末端请求 Url 和图片保存写入
headers = {
'Referer': f'{web}',
'User-Agent': 'Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}# 请求头
res = requests.get(Web)# 访问对应 Url, 返回信息到 res
result = etree.HTML(res.content)# 通过 etree.HTML 的函数讲 res 进行解析, 这样才能通过 xpath 来找到图片
# print(etree.tostring(result).decode("utf-8"))
img_list = result.xpath("//div[@class='content-pic']/a/img/@src")# 将所有 @src 图片地址放到列表中
print(img_list)
for img in img_list:# 遍历上面的列表
rimage = requests.get(img, headers=headers)# 将每次遍历到的图片 src, 返回给 rimage
with open(f'img2/{text}_{no}.jpg', 'wb') as f:# 打开 Img 文件夹保存定义的文件名,
f.write(rimage.content)
if __name__ == '__main__':
get_main()
来源: http://www.bubuko.com/infodetail-2908081.html