Python爬取妹子图
目的
爬取妹子图浏览排行榜所有图片
目标url:
目标效果:
环境:
python3 + requests + lxml
实现方法:
- 爬取浏览排行榜各图集信息(图集内容链接+ 缩略图地址):
例:图集内容链接 “http://www.mmjpg.com/mm/53”
缩略图地址 “http://fm.shiyunjj.com/small/2015/53.jpg” - 爬取每个图集内容信息(图集名称 + 图集页码数):
通过图集内容链接爬取图集的名称和页码数,用来命名和拼接图片地址 - 拼接图片地址:
例:“http://fm.shiyunjj.com/2015/53/1.jpg”
图片地址与缩略图地址的差别是,图片地址中没有字符 “small/” ,但多了 “/1”,即后面加了页码,所以可以通过缩略图拼接图片地址。 - 保存图片
代码
import os
import time
import requests
from lxml import etree
# 获取所有图集的内容链接和缩略图地址
def get_list(url, headers):
response = requests.get(url, headers=headers)
html = etree.HTML(response.content)
lis = html.xpath('//div[@class="pic"]//li')
pic_list = []
for li in lis:
# 内容链接和缩略图地址
pic_info = li.xpath('./a/@href | ./a/img/@src')
pic_list.append(pic_info)
return pic_list
# 获取图片地址并保存本地
def get_img(content_url, thumbnail_url, headers):
response = requests.get(content_url, headers=headers)
html = etree.HTML(response.content)
# 图集页码
page_num = html.xpath('//div[@class="page"]/a/text()')[-2]
# 图集名称
title = html.xpath('//h2/text()')[0]
for i in range(1, int(page_num)+1):
time.sleep(1)
# 拼接图片地址
page_url = thumbnail_url.replace('small/', '').replace('.jpg', '/{}.jpg'.format(i))
headers1 = {
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;',
'Host': 'fm.shiyunjj.com',
'Referer': 'http://www.mmjpg.com'
}
try:
response = requests.get(page_url, headers=headers1).content
file_name = title + '({}-{})'.format(page_num, i) + '.jpg'
print('正在下载%s' % file_name)
with open(file_name, 'wb') as f:
f.write(response)
except Exception as e:
print(e)
def main():
headers = {'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;'}
url = 'http://www.mmjpg.com/hot/'
pic_list = get_list(url, headers=headers)
for pic_info in pic_list:
content_url, thumbnail_url = pic_info[0], pic_info[1]
get_img(content_url, thumbnail_url, headers)
if __name__ == "__main__":
path = os.path.join(os.getcwd(), '妹子图')
if not os.path.exists(path):
os.mkdir(path)
os.chdir(path)
main()