爬取网站的思路

第一步:首先分析爬取网站的连接地址特性,发现翻页图片的时候连接:http://www.mmjpg.com/mm/1570  ,http://www.mmjpg.com/mm/1569,只有后面的数字会变化

第二步:然后翻页1,2,3,用检查(查看源代码)来获取翻页的数字

第三步:查看图片的地址,保存后并写入文件内

思路就是这样的一个思路,具体用代码梳理具体的思路

第一步:

首先写一个主函数:包括:url,url后面的索引:index(1570),翻页(1,2),下载的图片地址;并且采用函数封装的思路

  1. def main(index):
  2. #1、写url地址
  3. main_url = 'http://www.mmjpg.com/mm/%s' % index
  4. #2、获取翻页地址,写一个get_page()函数
  5. page = get_page(main_url)
  6. if os.path.exists(path) != True:
  7. os.mkdir(path) #创建工作目录
  8. #print(path)
  9. else:
  10. os.chdir(path) #切换到工作目录
  11. #3、遍历所有页,获取图片的地址
  12. for i in range(1, int(page) + 1):
  13. url = '%s/%s' % (main_url, i)
  14. try:
  15. get_img(url) #获取图片地址
  16. except Exception as e:
  17. raise e

第二步:

抓取index,用函数封装写

  1. 1、用网页检查拿到1570html
  2. ''''
  3. <li><a href="http://www.mmjpg.com/mm/1570" target="_blank">切出来1570这个数字
  4. '''
  5. #获取http://www.mmjpg.com/mm/1570的index:如:1570,1569
  6. def get_index():
  7. #2、获取网页的html
  8. r = requests.get('http://www.mmjpg.com', headers=headers)
  9. r.encoding = 'utf-8'
  10. html = r.text
  11.  
  12. #3、etree.HTML():构造了一个XPath解析对象并对HTML文本进行自动修正。
  13. #etree.tostring():输出修正后的结果,类型是bytes
  14. selector = etree.HTML(html)
  15. #4、获取<li><a标签下的内容,[0]取第一个
  16. content = selector.xpath('//li/a')[0]
  17. #5、继续取href的内容,[0]取第一个:即:http://www.mmjpg.com/mm/1570
  18. num = content.xpath('@href')[0]
  19. #6、已斜杠为切片,获取不同的字符,即:['http:', '', 'www.mmjpg.com', 'mm', '1570']
  20. num = num.split('/')
  21. #7、取num最后一个字符,并强制转换成整形
  22. num = int(num[-1])
  23. #返回所有的index:1570,1569
  24. return range(1, num + 1)
  25. # for each in range(1,num+1):
  26. # print(each)

第三步:

获取翻页的1,2,3

  1. #1、鼠标放到翻页的1上面右键检查,得到以下内容
  2. '''
  3. <div class="page" id="page">
  4. <em class="ch preno">没有了</em>
  5. <em>1</em>
  6. <a href="/mm/1570/2">2</a>
  7. <a href="/mm/1570/3">3</a>
  8. <a href="/mm/1570/4">4</a>
  9. <a href="/mm/1570/5">5</a>
  10. <a href="/mm/1570/6">6</a>
  11. <i>
  12. </i>
  13. <a href="/mm/1570/50">50</a>
  14. <em class="ch all" id="opic" onclick="openall(1);">全部图片</em>
  15. <a href="/mm/1570/2" class="ch next">下一张</a></div>
  16. '''
  17. def get_page(url):
  18. r = requests.get(url, headers=headers)
  19. r.encoding = 'utf-8'
  20. html = r.text
  21.  
  22. selector = etree.HTML(html)
  23. #2、获取所有页:1、2...50、下一页,即获取下面<a>2<a>的2,3,4,5,6...50
  24. page = selector.xpath('//div[@id="page"]/a/text()')[-2]

第四步:

获取图片地址

  1. #1、鼠标放到图片上,右键检查,获取以下内容
  2. '''
  3. <div class="content" id="content">
  4. <a href="http://www.mmjpg.com/mm/1570/2">
  5. <img src="http://fm.shiyunjj.com/2018/1570/1i28.jpg" data-img="http://fm.shiyunjj.com/2018/1570/1i28.jpg" alt="萌味十足的小尤奈雪白胴体相当性感"></a>
  6. </div>
  7. '''
  8. #通过图片的地址来获取图片
  9. def get_img(url):
  10. r = requests.get(url, headers=headers)
  11. r.encoding = 'utf-8'
  12. html = r.text
  13. selector = etree.HTML(html)
  14. try:
  15. #2、取img标签下的内容
  16. content = selector.xpath('//div[@id="content"]/a/img')[0]
  17. #3、获取图片url地址
  18. img_url = content.xpath('@src')[0]
  19. #4、取图片名字
  20. title = content.xpath('@alt')[0]
  21. #5、 #保存标题和对应的url地址
  22. sav_img(title, img_url)
  23. except Exception as e:
  24. print('Erro!!!')
  25. pass

第六步:

编写__name__

  1. if __name__ == '__main__':
  2. indexs = get_index()
  3. #reversed()函数是返回序列seq的反向访问的迭代子,因为get_index()返回的是1570,1569,1568这样的序列,反向就是从1568,1569,1570
  4. for index in reversed(indexs):
  5. main(index)

完整的代码如下:

  1. import requests
  2. import os
  3. from lxml import etree
  4.  
  5. headers = {
  6. 'Referer': 'http://www.mmjpg.com/mm/',
  7. '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'
  8. }
  9.  
  10. #返回当前进程的工作目录
  11. path = os.getcwd() + '\img'
  12.  
  13. def get_index():
  14. r = requests.get('http://www.mmjpg.com',headers = headers)
  15. r.encoding= 'utf-8'
  16. html = r.text
  17.  
  18. selector = etree.HTML(html)
  19. content = selector.xpath('//li/a')[0]
  20. num = content.xpath('@href')[0]
  21. num = num.split('/')
  22. num = int(num[-1])
  23. return range(1,num+1)
  24.  
  25. def get_page(url):
  26. r = requests.get(url,headers=headers)
  27. r.encoding = 'utf-8'
  28. html = r.text
  29.  
  30. selector = etree.HTML(html)
  31. page = selector.xpath('//div[@id="page"]/a/text()')[-2]
  32. return (page)
  33.  
  34. def get_img(url):
  35. r = requests.get(url,headers=headers)
  36. r.encoding = 'utf-8'
  37. html = r.text
  38.  
  39. selector = etree.HTML(html)
  40. try:
  41. content = selector.xpath('//div[@id = "content"]/a/img')[0]
  42. img_url = content.xpath('@src')[0]
  43. title = content.xpath('@alt')[0]
  44. save_img(title,img_url)
  45. except Exception as e:
  46. print('Erro!!!')
  47. pass
  48.  
  49. def save_img(name,url):
  50. name = name + '.jpg'
  51. if name in os.listdir(path):
  52. print('重复文件')
  53. else:
  54. r = requests.get(url,headers=headers)
  55. with open(name,'wb') as f:
  56. f.write(r.content)
  57. print(name)
  58.  
  59. def main(index):
  60. main_url = 'http://www.mmjpg.com/mm/%s'%index
  61. page = get_page(main_url)
  62. if os.path.exists(path)!= True:
  63. os.mkdir(path)
  64. else:
  65. os.chdir(path)
  66.  
  67. for i in range(1,int(page)+1):
  68. url = '%s/%s'%(main_url,i)
  69. try:
  70. get_img(url)
  71. except Exception as e:
  72. raise e
  73.  
  74. if __name__ == '__main__':
  75. index = get_index()
  76. for index in reversed(index):
  77. 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. node.js初识11

    1.EJS  Embedded JavaScript templates 模板引擎 .EJS的效率不高,因为他后台是通过字符串来处理的 <ul> <% for(var i = 0 ; ...

  2. jQuery-插入内容-新增内容

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 软工网络15团队作业4——Alpha阶段敏捷冲刺3.0

    软工网络15团队作业4--Alpha阶段敏捷冲刺3.0 1.每天举行站立式会议,提供当天站立式会议照片一张. 2.项目每个成员的昨天进展.存在问题.今天安排. 成员 昨天已完成 今天计划完成 郭炜埕 ...

  4. IoC, DI,Spring.net

    IoC : Inversion of Control , 控制反转,就是创建对象(实例)的权利由开发人员自己控制New转到了由容器来控制.实现了解耦. DI: Dependency Injection ...

  5. vs实现数据库数据迁移

    public ActionResult About() { List<ChangeData.Models.old.adsinfo> adsinfo_new = new List<Mo ...

  6. Windows 7关闭睡眠(休眠)模式和删除休眠文件

    原文地址:https://www.192ly.com/pc/win7/gb-sm.html 怎么关闭Windows 7关闭睡眠(休眠)功能?Windows 7系统中怎么删除休眠文件?Windows 7 ...

  7. java设计模式之动态代理的概述和实现

    概述 1.代理:本来应该自己做的事情,请了别人来做,被请的人就是代理对象. 举例:春节回家买票让人代买 2.在Java中java.lang.reflect包下提供了一个Proxy类和一个Invocat ...

  8. 初探AngularJs框架(二)

    一.创建Components组件 直接使用AngularCLI即可很方便的创建component组件,使用如下指令: ng g component components/news 这样就会在compo ...

  9. java == 与 equals 相同与不同点

    java中与很多有意思又值得深究的点. 写这篇文章呢,是由于在百度知道中看到一个问题:怎样比较两个对象是否相同.这又使我想到了另外一个问题,== 和 equals有什么不同?写了几行代码,看了几篇文章 ...

  10. [转载]DLL命名规则

    程序集是一个部署单元,同时还代表托管代码程序的身份.一般来说一个程序集仅与一个DLL相对应.本节主要讲DLL命名约定,程序集的命名约定与此类似. 要记住,名字空间与DLL和程序集是不同的概念.名字空间 ...