爬取网站的思路

第一步:首先分析爬取网站的连接地址特性,发现翻页图片的时候连接: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--爬取妹子图】的更多相关文章

  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 ...

  10. python实战项目 — 爬取 妹子图网,保存图片到本地

    重点: 1. 用def函数 2. 使用 os.path.dirname("路径保存") , 实现每组图片保存在独立的文件夹中 方法1: import requests from l ...

随机推荐

  1. DataGrip设置长sql语句自动换行

    我这个DataGrip是英文版的. 在每个查询窗口(Console)的工具图标里,有个Settings.打开Settings弹出框,试图从Appearance和Editor里找到设置选项,却没有找到. ...

  2. caffe slover文件详解

    solver算是caffe的核心的核心,它协调着整个模型的运作.caffe程序运行必带的一个参数就是solver配置文件.运行代码一般为 # caffe train --solver=*_slover ...

  3. Java第一次考试作业

    这次考试感觉自己充分的意识到自己的不足,对于Java没有系统的理解,敲程方面也有很大问题,本次程序题目为ATM机的账户记录Account有账户的唯一性标识,用户的姓名,操作日期(Date),操作类型, ...

  4. jsp的文件包含漏洞

    jsp的文件包含分静态包含的动态包含两种: 静态包含:<%@include file="top.jsp"%> 动态包含:<jsp:include page=&qu ...

  5. c#中枚举类型的定义与使用

    介绍枚举是一个指定的常数,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举.定义默认基数从O开 ...

  6. laravel 之jwt认证使用详解

    转载 http://www.heibaiketang.com/blog/show/3.html https://packagist.org/packages/tymon/jwt-auth#1.0.0- ...

  7. 导入转储文件的时候:Error Code: 1406. Data too long for column - MySQL

    MySQL will truncate any insert value that exceeds the specified column width. to make this without e ...

  8. [5]windows内核情景分析---进程线程

    本篇主要讲述进程的启动过程.线程的调度与切换.进程挂靠 进程的启动过程: BOOL CreateProcess ( LPCTSTR lpApplicationName,                 ...

  9. <1>lua编译环境 数据类型和局部变量

    1.编译环境 http://www.lua.org/download.html下载 解压后 bin目录中lua.exe运行   luac.exe编译成lua字节码 2.基本数据类型 整数,小数,布尔值 ...

  10. HDU1007.Quoit Design

    -- 点我 -- 题目大意 :给你一堆点,求一个最小圆能够覆盖两个点的半径(最近两点距离的一半): 最多100000个点,暴力即O(n^2)会超时,考虑二分,先求左边最短距离dl,右边dr, 和一个点 ...