参考网站:https://blog.csdn.net/Young_Child/article/details/78571422

在爬的过程中遇到的问题:

1、被ban:更改header的User-Agent,伪装成浏览器浏览,如果还被ban可以使用代理,这个网站只需要伪装头再加上time.sleep()就可以解决了(我导入了fake_useragent,也可以自己造个轮子,我比较懒,直接用了别人的轮子)

2、下载下来的图片是同一张,全是防盗链图片这个问题我也找了好久,结果发现只要在头里加上’Referer’就可以了

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。——百度百科

3. 此代码需要在在linux的python2下运行,在windows下会出现异常。

完整代码如下

  1 #!/usr/bin/evn python
  2 # -*- coding:utf-8 -*-
  3 # __author__:
  4 #import urllib2
  5 import bs4
  6 import time
  7 import requests
  8 import fake_useragent
  9 import os
 10 import re
 11 import sys
 12 #import xlrd
 13 import random
 14
 15 # 用于将u 转换成 string
 16 reload(sys)
 17 sys.setdefaultencoding('utf-8')  # u -> str
 18
 19
 20 class GetPictures(object):
 21     def __init__(self):
 22         self.url = 'http://www.mmjpg.com/mm/1'
 23         self.first_num = 0
 24         self.sum_num = 0
 25         self.pictures_sum()
 26         self.urls = self.get_urls()
 27         for url in self.urls:
 28             self.down_pictures(self.get_img_urls(url))
 29
 30     # 输入需要的套数
 31     def pictures_sum(self):
 32         str1 = raw_input(r"第几套开始,重复会跳过")
 33         try:
 34             self.first_num = int(float(str1))
 35         except ValueError:
 36             print ('输入的不为数字')
 37
 38         str1 = raw_input("收集多少套")
 39         try:
 40             self.sum_num = int(float(str1))
 41         except ValueError:
 42             print("输入的不为数字")
 43             exit(1)
 44
 45     # 得到所有套图的第一张所在网页的URL
 46     def get_urls(self):
 47         urls = []
 48         for i in xrange(self.first_num, self.first_num+self.sum_num):
 49             url_split = self.url.split('/')
 50             url_split[-1] = str(i)
 51             urls.append('/'.join(url_split))
 52         # print urls
 53         return urls
 54
 55     # 得到一共有多少张图
 56     def get_img_sum_num(self, img_url):
 57         fa = fake_useragent.UserAgent()
 58         headers = {'User-Agent': fa.random,
 59                    'Referer': 'http://www.mmjpg.com'}
 60         request = requests.get(img_url, headers=headers)
 61         soup = bs4.BeautifulSoup(request.content, 'lxml')
 62         # 获取标签里面的值
 63         img_sum_number = soup.find_all('a', href=re.compile('/mm'))[8].get_text().strip()
 64         print img_sum_number
 65         img_sum_number = int(img_sum_number)
 66         # print img_sum_number
 67         return img_sum_number
 68
 69     # 得到该套图中的所有图片的URL
 70     def get_img_urls(self, url):
 71         fa = fake_useragent.UserAgent()
 72         headers = {'User-Agent': fa.random,
 73                    'Referer': 'http://m.mmjpg.com'}
 74         request = requests.get(url, headers=headers)
 75         soup = bs4.BeautifulSoup(request.content, 'lxml')
 76         first_img_url = soup.find('img').get('src')     # 获取标签值
 77         url_split = first_img_url.split('/')
 78         img_urls = []
 79         for i in xrange(1, self.get_img_sum_num(url)+1):
 80             url_split[-1] = (str(i)+'.jpg')
 81             img_urls.append('/'.join(url_split))
 82         # print img_urls
 83         return img_urls
 84
 85     # 下载图片
 86     def down_pictures(self, img_urls):
 87         img_name = str(img_urls[0].split('/')[-2])+'-'+str(img_urls[0].split('/')[-3])
 88         if os.path.exists(img_name):    # 查重 如果这个文件夹存在则跳过 防止重复下载
 89             time.sleep(1)
 90             print img_name+'存在'
 91             return
 92         os.mkdir(img_name)
 93         for img_url in img_urls:
 94             fa = fake_useragent.UserAgent()
 95             headers = {'User-Agent': fa.random,
 96                        'Referer': 'http://m.mmjpg.com'}
 97             request = requests.get(img_url, headers=headers)
 98
 99             with open(img_name + u'/' + img_url.split('/')[-1], 'wb') as f:
100                 f.write(request.content)    # contents返回的为二进制   text返回的为union类型
101                 f.close()
102                 print "已保存" + img_name + '/' + img_url.split('/')[-1]
103                 time.sleep(random.random()*2)
104
105
106 # 运行程序
107 if __name__ == '__main__':
108     GetPictures()
109
110 '''
111 用requests,bs4 抓取mmjpg.com上的套图
112 将上面的套图按套进行保存
113 '''

转载于:https://www.cnblogs.com/regit/p/9273277.html

爬虫实战3:使用request,bs4爬动态加载图片相关推荐

  1. Delphi FastReport动态加载图片

    Delphi  FastReport动态加载图片 2011-01-06         作者:李海彬 阅读:684 以前用FastReport制作报表,从来没有打印过图片,这段时间做了个打印个人简历的 ...

  2. vue+elementui 中src动态加载图片的时候不起作用

    vue+elementui 中src动态加载图片的时候不起作用 代码如下: <el-table-column align="center" label="宠物图片& ...

  3. vue 动态加载图片路径报错解决方法

    vue 动态加载图片路径报错解决方法 参考文章: (1)vue 动态加载图片路径报错解决方法 (2)https://www.cnblogs.com/qingcui277/p/8930507.html ...

  4. jQuery页面滚动 动态加载图片等元素

    相信大家见过好多随着页面滚动,动态加载图片等元素的网站,我也是,以前见了好多,只是没时间去研究,今天晚上有空,百度了一下找了一个jquery插件,作者张鑫旭,效果挺好,代码也很简单,使用更方便,废话不 ...

  5. 解决问题:swiper动态加载图片后无法滑动

    解决问题:swiper动态加载图片后无法滑动 参考文章: (1)解决问题:swiper动态加载图片后无法滑动 (2)https://www.cnblogs.com/yangguoe/p/9857398 ...

  6. html5动态加载图片和加载视频

    这两在做一个动态加载图片的东西,有点类似QQ发说说里面附带图片的那种,经过测试可以任意添加.删除,然后该删除的位置被后一位自动填充,还有一个bug,就是最后一个图片的控件没做处理,删掉最后一个就会导致 ...

  7. 动态加载图片,实现瀑布流效果

    瀑布流 1.瀑布流 瀑布流,可以有多列,每一列的高度可以不相同,但是宽度必须一样: 排列的方式是,从左往右排列,哪一列总高度最小,就优先排序,把图片放在这一列. 这样排完所有的图片后,可以保证每一列的 ...

  8. viewer动态加载图片第一次点击预览图片失败的问题

    如果您搜到这篇文章的话,那估计您遇到跟我一样的问题了. 众所周知,每一个插件都有很多坑,比如说市面上比较火爆的 图片浏览插件viewer,有js版本和jqery版本的,尽管这两个版本不一样,但是大同小 ...

  9. 游戏UI动态加载图片优化

    说到UI优化,很多人对其并不以为意,UI的制作无非使用UGUI或者NGUI.UI优化主要是针对图集,还有一些依赖项的优化,针对的是内存优化,上面这些都是关于静态UI的优化,这个是作为程序员都要经历的阶 ...

最新文章

  1. linux shell 运算符 | || () {}
  2. ArrayList源码分析(基于JDK1.6)
  3. jQuery 事件绑定方法(bind hover toggle live.... )、删除事件方法(unbind, die)及 事件对象
  4. 粒子群算法(PSO)Matlab实现(两种解法)
  5. Stanford UFLDL教程 池化Pooling
  6. svn 提交到远程仓库_聊聊如何从SVN迁移源码到Git仓库
  7. linux 显示文字在桌面背景,Linux下Xwindow的字体配置(所谓的字体美化)
  8. 分组数据方差公式_统计学公式
  9. WEB安全基础-HTML+PHP实践
  10. 干货| LeNet-5模型详解(附Python详细代码及注释)
  11. 一元三次方程重根判别式_一元四次方程的常规解法
  12. 【JavaScript】查漏补缺 —对象转换成字符串JSON.stringify()
  13. 8 更新全局变量_2月26日守望先锋版本更新
  14. 将查询出来的数据按照一个字段分组且排序过程中,遇到的一些有关group的问题(分组排序应该使用partition by)
  15. python集合常用方法_python基础-集合set的常用方法
  16. c++ 11之 lambda表达式的使用
  17. directx.sys和svchost.com
  18. Pycharm一直显示connecting to console
  19. android 开发笔记 (黎活明)
  20. 第三方自动投票软件制作教程

热门文章

  1. IDEA 多Moudle指定当前Moudle的JDK版本
  2. ubuntu系统搭建软raid
  3. 知识点小悟2019-1-18
  4. 8.1 Python图像处理之图像典型分割-SUSAN边缘检测
  5. mysql认证题库_MySQL 8 OCP(1Z0-908)认证考试题库原题(第11题)
  6. 2019 年 2 月份文章汇总
  7. BreederDAO 在 A 轮融资中筹集了 1000 万美元
  8. 发布支持VR的Web3D内容
  9. win10_3D画图软件文字粘贴时的BUG解决
  10. Android 7.0 变更