爬虫实战3:使用request,bs4爬动态加载图片
参考网站: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下会出现异常。
完整代码如下
#!/usr/bin/evn python
# -*- coding:utf-8 -*-
# __author__:
#import urllib2
import bs4
import time
import requests
import fake_useragent
import os
import re
import sys
#import xlrd
import random # 用于将u 转换成 string
reload(sys)
sys.setdefaultencoding('utf-8') # u -> str class GetPictures(object):
def __init__(self):
self.url = 'http://www.mmjpg.com/mm/1'
self.first_num = 0
self.sum_num = 0
self.pictures_sum()
self.urls = self.get_urls()
for url in self.urls:
self.down_pictures(self.get_img_urls(url)) # 输入需要的套数
def pictures_sum(self):
str1 = raw_input(r"第几套开始,重复会跳过")
try:
self.first_num = int(float(str1))
except ValueError:
print ('输入的不为数字') str1 = raw_input("收集多少套")
try:
self.sum_num = int(float(str1))
except ValueError:
print("输入的不为数字")
exit(1) # 得到所有套图的第一张所在网页的URL
def get_urls(self):
urls = []
for i in xrange(self.first_num, self.first_num+self.sum_num):
url_split = self.url.split('/')
url_split[-1] = str(i)
urls.append('/'.join(url_split))
# print urls
return urls # 得到一共有多少张图
def get_img_sum_num(self, img_url):
fa = fake_useragent.UserAgent()
headers = {'User-Agent': fa.random,
'Referer': 'http://www.mmjpg.com'}
request = requests.get(img_url, headers=headers)
soup = bs4.BeautifulSoup(request.content, 'lxml')
# 获取标签里面的值
img_sum_number = soup.find_all('a', href=re.compile('/mm'))[8].get_text().strip()
print img_sum_number
img_sum_number = int(img_sum_number)
# print img_sum_number
return img_sum_number # 得到该套图中的所有图片的URL
def get_img_urls(self, url):
fa = fake_useragent.UserAgent()
headers = {'User-Agent': fa.random,
'Referer': 'http://m.mmjpg.com'}
request = requests.get(url, headers=headers)
soup = bs4.BeautifulSoup(request.content, 'lxml')
first_img_url = soup.find('img').get('src') # 获取标签值
url_split = first_img_url.split('/')
img_urls = []
for i in xrange(1, self.get_img_sum_num(url)+1):
url_split[-1] = (str(i)+'.jpg')
img_urls.append('/'.join(url_split))
# print img_urls
return img_urls # 下载图片
def down_pictures(self, img_urls):
img_name = str(img_urls[0].split('/')[-2])+'-'+str(img_urls[0].split('/')[-3])
if os.path.exists(img_name): # 查重 如果这个文件夹存在则跳过 防止重复下载
time.sleep(1)
print img_name+'存在'
return
os.mkdir(img_name)
for img_url in img_urls:
fa = fake_useragent.UserAgent()
headers = {'User-Agent': fa.random,
'Referer': 'http://m.mmjpg.com'}
request = requests.get(img_url, headers=headers) with open(img_name + u'/' + img_url.split('/')[-1], 'wb') as f:
f.write(request.content) # contents返回的为二进制 text返回的为union类型
f.close()
print "已保存" + img_name + '/' + img_url.split('/')[-1]
time.sleep(random.random()*2) # 运行程序
if __name__ == '__main__':
GetPictures() '''
用requests,bs4 抓取mmjpg.com上的套图
将上面的套图按套进行保存
'''
爬虫实战3:使用request,bs4爬动态加载图片的更多相关文章
- Unty3D动态加载图片
试验动态加载图片,代码如下: using UnityEngine; using System.Collections; public class DynamicLoad : MonoBehaviour ...
- ie6,7下js动态加载图片不显示错误
ie6,7下js动态加载图片不显示错误 先描述一下出现这种匪夷所思bug的背景: 我在页面加载的时候加载一堆小缩略图,<a href="javascript:void(0);" ...
- asp.net向后台传参数动态加载图片
//向后台传参数动态加载图片 $(function() { $("#Button1").click(function() { var stockcode = getUrlParam ...
- vue动态加载图片,取消格式验证
vue 一. 动态加载图片 (以vue模板为例) app.vue 代码如下: <template> <div id="app"> <img :src= ...
- swift 基础小结01 --delegate、Optional、GCD的使用、request请求、网络加载图片并保存到沙箱、闭包以及桥接
本文主要记录swift中delegate的使用.“?!”Optional的概念.GCD的使用.request请求.网络加载图片并保存到沙箱.闭包以及桥接. 一.delegate的使用 swift中de ...
- 【MFC】picture控件 两种有细微差别的动态加载图片方法
摘自:http://www.jizhuomi.com/software/193.html VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control) 分类标签: 编程入门 ...
- 关于Unity里动态加载图片
Resources.Load 使用该方法可以动态加载资源 过程: 1.首先需要在Project面板里创建一个名为Resources的文件夹(名字必须是这个 不能写错啊) 2.把要加载的游戏对象放到该目 ...
- 解决问题:swiper动态加载图片后无法滑动
原因:swiper在初始化的时候会扫描swiper-wrapper下面的swiper-slide的个数,从而完成初始化,但是由于动态加载时在初始化之后的动作,所以导致无法滑动. 解决方案 1:在动态获 ...
- Unity3D-NGUI动态加载图片
NGUI提供了很方便的UIAtlas,其主要作用是改进DrawCall,把众多图片整合在一张贴图上,由于UNITY3D简单易用的好处,所以只是用原生的GUI很容易忽视DrawCall的问题,所以NGU ...
随机推荐
- Android APK反编译详解(转)
转自:http://blog.csdn.net/ithomer/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代 ...
- 南京大学发布无序列限制的DNA编辑新工具(转自生物通)
编辑推荐: 内切酶经过改造可以成为强大的DNA编辑工具,比如ZFN.TALEN.风头正劲的CRISPR–Cas系统和充满争议的NgAgo技术.不过这些技术都是通过序列识别来实现靶向切割的,会受到序列偏 ...
- (转)Java 中关于String的空对象(null) ,空值(empty),空格
原文出处:Java 中关于String的空对象(null) ,空值(empty),空格 定义 空对象: String s = null; 空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例 ...
- C# 与 Java Rsa加密与解密互通
Rsa 加密标准的制定已经过去了十多年了. 这两天在看rsa 加密的文章,基本上都是在说 .net 与 java 之间的 rsa加密是不能互通的.因为项目有用到,所以花了点时间对rsa加密做了一点点了 ...
- TLB与内存寻址,内存读取,虚拟内存的相关原理
TLB(Translation Lookaside Buffer)转换检测缓冲区是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存. TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个 ...
- 想成为一名成功的UX设计师吗?做好这13件事情吧
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 丢掉那些阻碍你前进的东西 每个人对成功的定义都不同.如果想在重要事情上取得成功,学会给予才是关键.只 ...
- 访问localhost文件下的testmysql.php文件报Not Found
但是访问localhost:8081/index.php没有报该错误,页面显示success,并没有显示wamp的主页 出错原因:Apache和php没关联好,修改一下Apache的httpd.con ...
- C程序设计语言(2)文摘
第一章 导言 1.1 入门 1.2 变量与算术表达式 1.3 for语句 1.4 符号常量 1.5 字符输入输出 #include "stdafx.h" main(int argc ...
- iOS9 视频播放
self.videoFileURL = [NSURL URLWithString:[NSString stringWithFormat:@"file:///%@", self ...
- loadrunner - 安装与破解
最近准备学习LR,借助这个平台,将自己的学习经历记录下来,当然很多都不是原创,都是遇到问题时各种百度,然后梳理下知识是为了避免以后遇到同样的错误时,能回过头来参考参考. 下面的是转载某位大神的博客,尊 ...