思路:1、get_totalpages(url)  通过【性。感。美。女。图】获得该版块的总页数 【首页1234567891011下一页末页共 21页1034条】

2、get_sercoverurl(pageurl) 版块每一页有50个系列的封面,获得每个封面的地址。

3、 进入该封面(即系列),获得该系列图片的总张数【[url=]共79页:[/url]上一页12345678910111213下一页】

4、get_serurl(sercoverurl) 获得每一个图片所在页面的地址

5、urllib.request.urlretrieve(picurl, filename) 获得图片的下载地址。

根据网站结构,总结了 版块 -< 系列 -- 系列封面 -< 图片页面 -- 图片下载地址 的编排规律,

其中" -< " 表示 1对多,即1个版块有多个系列, 1个系列封面有多个图片;

" -- " 表示 1对1, 如1个系列只有1个封面, 1个图片页面只有1个图片下载地址

搞清楚这些就明白哪些地方需要循环了。

废话太多,直接上代码吧!

import urllib.request
import os
import re def url_open(url):
req = urllib.request.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36')
response = urllib.request.urlopen(url)
html = response.read()
return html def get_totalpages(url): #通过版块地址获得该版块所有页数(每页有50个系列),返回值为数字
html = url_open(url).decode('gbk')
reg = r'共 <strong>(.*?)</strong>页'
totalpages = re.findall(reg,html)[0]
return int(totalpages) def get_sercoverurl(pageurl): #通过页面地址获得该页面下所有系列的封面地址,返回值为列表
html = url_open(pageurl).decode('gbk')
reg = r'<p><a href="(.*?)"'
sercoverurl = re.findall(reg, html)
return sercoverurl #各个系列的封面 列表 def get_serurl(sercoverurl): #通过封面获得该系列的所有图片所在的页面地址 (每个页面有一张图片,其地址待下一步获取)
html = url_open(sercoverurl).decode('gbk') #
reg1 = r'<li><a>共(.*?)页'
totalsheets = int(re.findall(reg1, html)[0]) # 获得该系列图片总张数
serurls = []
serurls.append(sercoverurl)
for eachsheet in range(2,totalsheets+1):
serurl = sercoverurl[:-5] + '_' + str(eachsheet) + sercoverurl[-5:]
serurls.append(serurl)
return serurls def get_picurl(serurl):
html = url_open(serurl).decode('gbk')
reg = r"<img src='(.*?)'"
picurl = re.findall(reg,html)[0] return picurl #只有一个地址,即封面地址 def download_cl(folder = '爬虫youmzi'): #主程序
try:
os.mkdir(folder)
os.chdir(folder)
except:
os.chdir(folder)
url = 'http://www.youmzi.com/meinv.html'
totalpages = get_totalpages(url)
print(totalpages)
for eachpage in range(1,totalpages+1):
pageurl = url[:-5] + '_'+ str(eachpage) + url[-5:]
print(pageurl)
sercoverurl = get_sercoverurl(pageurl) #获得系列的封面地址 列表
print(sercoverurl)
for eachsercover in sercoverurl:
serurl = get_serurl(eachsercover) #返回系列的所有地址 列表
for oneser in serurl:
picurl = get_picurl(oneser)
print(picurl)
filename = picurl.split('/')[-1]
urllib.request.urlretrieve(picurl, filename) if __name__ == '__main__':
download_cl()

Python3x 爬取妹子图的更多相关文章

  1. Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...

  2. Python 爬虫入门之爬取妹子图

    Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...

  3. scrapy 也能爬取妹子图?

    目录 前言 Media Pipeline 启用Media Pipeline 使用 ImgPipeline 抓取妹子图 瞎比比前言 我们在抓取数据的过程中,除了要抓取文本数据之外,当然也会有抓取图片的需 ...

  4. 使用request+Beautiful爬取妹子图

    一.request安装 pip install requests request使用示例 import requests response = requests.get('https://www.mz ...

  5. requests+正则表达式 爬取 妹子图

    做了一个爬取妹子图某张索引页面的爬虫,主要用request和正则表达式. 感谢 崔庆才大神的 爬虫教学视频 和 gitbook: B站:https://www.bilibili.com/video/a ...

  6. 爬取妹子图(requests + BeautifulSoup)

    刚刚入门爬虫,今天先对于单个图集进行爬取,过几天再进行翻页爬取. 使用requests库和BeautifulSoup库 目标网站:妹子图 今天是对于单个图集的爬取,就选择一个进行爬取,我选择的链接为: ...

  7. 小白学 Python 爬虫(16):urllib 实战之爬取妹子图

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. 利用 PhpQuery 随机爬取妹子图

    前言 运行下面的代码会随机得到妹子图的一张图片,代码中的phpQuery可以在这里下载:phpQuery-0.9.5.386.zip <?php require 'phpQuery.php'; ...

  9. python 爬取妹子图

    作为一个python还没入门的小白,搞懂这段代码实在是很不容易,还要去学html的知识(#黑脸) 因此我加上了注释,比较好读懂点 #coding=utf-8 import time import re ...

随机推荐

  1. 去哪网实习总结:递归构建“流程运行顺序”的XML文件(JavaWeb)

    本来是以做数据挖掘的目的进去哪网的,结构却成了系统开发... 只是还是比較认真的做了三个月,老师非常认同我的工作态度和成果.. . 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题.分享 ...

  2. 网站收到的url请求链接,字母全部变为小写

    http://www.ithao123.cn/content-5360465.html

  3. Lintcode---二叉树的最大节点

    在二叉树中寻找值最大的节点并返回. 您在真实的面试中是否遇到过这个题? Yes 样例 给出如下一棵二叉树: 1 / \ -5 2 / \ / \ 0 3 -4 -5 返回值为 3 的节点. 思路: 题 ...

  4. Redis(十七):批量操作Pipeline

    大多数情况下,我们都会通过请求-相应机制去操作redis.只用这种模式的一般的步骤是,先获得jedis实例,然后通过jedis的get/put方法与redis交互.由于redis是单线程的,下一次请求 ...

  5. 为什么会找不到D层文件?

    近期两天在重装系统,今天好不easy把各种东西都装齐全了,再打开我的机房收费系统,就提演示样例如以下错误: 看到这个问题.我感觉非常熟,由于曾经也遇到过两次这个问题,都是改了下D层的编译路径.改到了U ...

  6. 2、visual studio 常用设置

    1.关闭 “引用” 提示 有时候感觉 “方法” 或者 “类” 上的引用有点乱: 去掉它的步骤: 1)在 “引用”文字上单击鼠标右键: 2)在弹出的“选项” 对话框中,取消 CodeLens: 2.打开 ...

  7. 深入浅出Spring(一)Spring概述

    现在很多的企业级项目中基本上都会用到了Spring框架,那么为什么会出现Spring,Spring是什么?这次的博文我主要为大家简单介绍一下Spring. Java EE优缺点 我们都知道在2003年 ...

  8. 内存对齐与ANSI C中struct型数据的内存布局

    当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将如何在内存中放置这些字段?ANSI C对结构体的内存布局有什么要求?而我们的程序又能否依赖这种布局?这些问题或许对不 ...

  9. Ubuntu 12.04下LAMP环境的搭建

    首先 apt-get install update 一下 sudo apt-get install update 安装MySQL 的服务端和客户端 sudo apt-get install mysql ...

  10. Java反射机制在代理模式中的使用

    代理模式的核心思路就是一个接口有两个子类,一个子类完成核心的业务操作,另一个子类完成与核心业务有关的辅助性操作. 代理模式分为静态代理模式和动态代理模式.  静态代理模式: //接口类 interfa ...