【Python56--爬取妹子图】
爬取网站的思路
第一步:首先分析爬取网站的连接地址特性,发现翻页图片的时候连接:http://www.mmjpg.com/mm/1570 ,http://www.mmjpg.com/mm/1569,只有后面的数字会变化
第二步:然后翻页1,2,3,用检查(查看源代码)来获取翻页的数字
第三步:查看图片的地址,保存后并写入文件内
思路就是这样的一个思路,具体用代码梳理具体的思路
第一步:
首先写一个主函数:包括:url,url后面的索引:index(1570),翻页(1,2),下载的图片地址;并且采用函数封装的思路
- def main(index):
- #1、写url地址
- main_url = 'http://www.mmjpg.com/mm/%s' % index
- #2、获取翻页地址,写一个get_page()函数
- page = get_page(main_url)
- if os.path.exists(path) != True:
- os.mkdir(path) #创建工作目录
- #print(path)
- else:
- os.chdir(path) #切换到工作目录
- #3、遍历所有页,获取图片的地址
- for i in range(1, int(page) + 1):
- url = '%s/%s' % (main_url, i)
- try:
- get_img(url) #获取图片地址
- except Exception as e:
- raise e
第二步:
抓取index,用函数封装写
- 1、用网页检查拿到1570的html
- ''''
- <li><a href="http://www.mmjpg.com/mm/1570" target="_blank">切出来1570这个数字
- '''
- #获取http://www.mmjpg.com/mm/1570的index:如:1570,1569
- def get_index():
- #2、获取网页的html
- r = requests.get('http://www.mmjpg.com', headers=headers)
- r.encoding = 'utf-8'
- html = r.text
- #3、etree.HTML():构造了一个XPath解析对象并对HTML文本进行自动修正。
- #etree.tostring():输出修正后的结果,类型是bytes
- selector = etree.HTML(html)
- #4、获取<li><a标签下的内容,[0]取第一个
- content = selector.xpath('//li/a')[0]
- #5、继续取href的内容,[0]取第一个:即:http://www.mmjpg.com/mm/1570
- num = content.xpath('@href')[0]
- #6、已斜杠为切片,获取不同的字符,即:['http:', '', 'www.mmjpg.com', 'mm', '1570']
- num = num.split('/')
- #7、取num最后一个字符,并强制转换成整形
- num = int(num[-1])
- #返回所有的index:1570,1569
- return range(1, num + 1)
- # for each in range(1,num+1):
- # print(each)
第三步:
获取翻页的1,2,3
- #1、鼠标放到翻页的1上面右键检查,得到以下内容
- '''
- <div class="page" id="page">
- <em class="ch preno">没有了</em>
- <em>1</em>
- <a href="/mm/1570/2">2</a>
- <a href="/mm/1570/3">3</a>
- <a href="/mm/1570/4">4</a>
- <a href="/mm/1570/5">5</a>
- <a href="/mm/1570/6">6</a>
- <i>
- </i>
- <a href="/mm/1570/50">50</a>
- <em class="ch all" id="opic" onclick="openall(1);">全部图片</em>
- <a href="/mm/1570/2" class="ch next">下一张</a></div>
- '''
- def get_page(url):
- r = requests.get(url, headers=headers)
- r.encoding = 'utf-8'
- html = r.text
- selector = etree.HTML(html)
- #2、获取所有页:1、2...50、下一页,即获取下面<a>2<a>的2,3,4,5,6...50
- page = selector.xpath('//div[@id="page"]/a/text()')[-2]
第四步:
获取图片地址
- #1、鼠标放到图片上,右键检查,获取以下内容
- '''
- <div class="content" id="content">
- <a href="http://www.mmjpg.com/mm/1570/2">
- <img src="http://fm.shiyunjj.com/2018/1570/1i28.jpg" data-img="http://fm.shiyunjj.com/2018/1570/1i28.jpg" alt="萌味十足的小尤奈雪白胴体相当性感"></a>
- </div>
- '''
- #通过图片的地址来获取图片
- def get_img(url):
- r = requests.get(url, headers=headers)
- r.encoding = 'utf-8'
- html = r.text
- selector = etree.HTML(html)
- try:
- #2、取img标签下的内容
- content = selector.xpath('//div[@id="content"]/a/img')[0]
- #3、获取图片url地址
- img_url = content.xpath('@src')[0]
- #4、取图片名字
- title = content.xpath('@alt')[0]
- #5、 #保存标题和对应的url地址
- sav_img(title, img_url)
- except Exception as e:
- print('Erro!!!')
- pass
第六步:
编写__name__
- if __name__ == '__main__':
- indexs = get_index()
- #reversed()函数是返回序列seq的反向访问的迭代子,因为get_index()返回的是1570,1569,1568这样的序列,反向就是从1568,1569,1570
- for index in reversed(indexs):
- main(index)
完整的代码如下:
- import requests
- import os
- from lxml import etree
- headers = {
- 'Referer': 'http://www.mmjpg.com/mm/',
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'
- }
- #返回当前进程的工作目录
- path = os.getcwd() + '\img'
- def get_index():
- r = requests.get('http://www.mmjpg.com',headers = headers)
- r.encoding= 'utf-8'
- html = r.text
- selector = etree.HTML(html)
- content = selector.xpath('//li/a')[0]
- num = content.xpath('@href')[0]
- num = num.split('/')
- num = int(num[-1])
- return range(1,num+1)
- def get_page(url):
- r = requests.get(url,headers=headers)
- r.encoding = 'utf-8'
- html = r.text
- selector = etree.HTML(html)
- page = selector.xpath('//div[@id="page"]/a/text()')[-2]
- return (page)
- def get_img(url):
- r = requests.get(url,headers=headers)
- r.encoding = 'utf-8'
- html = r.text
- selector = etree.HTML(html)
- try:
- content = selector.xpath('//div[@id = "content"]/a/img')[0]
- img_url = content.xpath('@src')[0]
- title = content.xpath('@alt')[0]
- save_img(title,img_url)
- except Exception as e:
- print('Erro!!!')
- pass
- def save_img(name,url):
- name = name + '.jpg'
- if name in os.listdir(path):
- print('重复文件')
- else:
- r = requests.get(url,headers=headers)
- with open(name,'wb') as f:
- f.write(r.content)
- print(name)
- def main(index):
- main_url = 'http://www.mmjpg.com/mm/%s'%index
- page = get_page(main_url)
- if os.path.exists(path)!= True:
- os.mkdir(path)
- else:
- os.chdir(path)
- for i in range(1,int(page)+1):
- url = '%s/%s'%(main_url,i)
- try:
- get_img(url)
- except Exception as e:
- raise e
- if __name__ == '__main__':
- index = get_index()
- for index in reversed(index):
- main(index)
【Python56--爬取妹子图】的更多相关文章
- Python 爬虫入门(二)——爬取妹子图
Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...
- Python 爬虫入门之爬取妹子图
Python 爬虫入门之爬取妹子图 来源:李英杰 链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...
- scrapy 也能爬取妹子图?
目录 前言 Media Pipeline 启用Media Pipeline 使用 ImgPipeline 抓取妹子图 瞎比比前言 我们在抓取数据的过程中,除了要抓取文本数据之外,当然也会有抓取图片的需 ...
- 使用request+Beautiful爬取妹子图
一.request安装 pip install requests request使用示例 import requests response = requests.get('https://www.mz ...
- requests+正则表达式 爬取 妹子图
做了一个爬取妹子图某张索引页面的爬虫,主要用request和正则表达式. 感谢 崔庆才大神的 爬虫教学视频 和 gitbook: B站:https://www.bilibili.com/video/a ...
- 爬取妹子图(requests + BeautifulSoup)
刚刚入门爬虫,今天先对于单个图集进行爬取,过几天再进行翻页爬取. 使用requests库和BeautifulSoup库 目标网站:妹子图 今天是对于单个图集的爬取,就选择一个进行爬取,我选择的链接为: ...
- 小白学 Python 爬虫(16):urllib 实战之爬取妹子图
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 利用 PhpQuery 随机爬取妹子图
前言 运行下面的代码会随机得到妹子图的一张图片,代码中的phpQuery可以在这里下载:phpQuery-0.9.5.386.zip <?php require 'phpQuery.php'; ...
- python 爬取妹子图
作为一个python还没入门的小白,搞懂这段代码实在是很不容易,还要去学html的知识(#黑脸) 因此我加上了注释,比较好读懂点 #coding=utf-8 import time import re ...
- python实战项目 — 爬取 妹子图网,保存图片到本地
重点: 1. 用def函数 2. 使用 os.path.dirname("路径保存") , 实现每组图片保存在独立的文件夹中 方法1: import requests from l ...
随机推荐
- 图像控件 ImageControl
图像控件 书:164 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns: ...
- laravel学习历程
1.www目录下拉下来一个laravel框架 composer create-project laravel/laravel laravelapp --prefer-dist laravelapp 为 ...
- Ubuntu中使用pip3报错
使用pip3 出现以下错误: Traceback (most recent call last): File “/usr/bin/pip3”, line 9, in from pip import m ...
- react的props验证
Props 验证使用 propTypes,它可以保证我们的应用组件被正确使用,React.PropTypes 提供很多验证器 (validator) 来验证传入数据是否有效. 当向 props 传入无 ...
- .NET 黑魔法 - asp.net core 身份认证 - Policy
身份认证几乎是每个项目都要集成的功能,在面向接口(Microservice)的系统中,我们需要有跨平台,多终端支持等特性的认证机制,基于token的认证方式无疑是最好的方案.今天我们就来介绍下在.Ne ...
- jQuery常用的取值或赋值的方法
$(selector).data(name) 从被取元素返回附加的数据 存在一个div标签:<div data-meeting="hi Tom"></div> ...
- 清华操作系统实验--80x86汇编基础
前言 80x86架构里,因为历史原因字是16位的,因此在汇编指令中用后缀-b,-w,-l来表示操作数是字节 字 或是双字 C声明 Intel数据类型 汇编代码后缀 大小(字节) char 字节 b 1 ...
- Java多线程-----原子变量和CAS算法
原子变量 原子变量保证了该变量的所有操作都是原子的,不会因为多线程的同时访问而导致脏数据的读取问题 Java给我们提供了以下几种原子类型: AtomicInteger和Ato ...
- F12搜索json内容
- 在hue中使用hive
一.创建新表 建表语句如下: CREATE TABLE IF NOT EXISTS user_collection_9( user_id string , seller_id string , pro ...