爬虫实战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 ...
随机推荐
- 四种常见的 POST 提交数据方式,使用postman会用到
http://www.aikaiyuan.com/6324.html 用postman时候,选错了就出不来结果.用postman选择 application/x-www-form-urlencoded
- Write File
Write to File with C++ #include <iostream.h> #include <fstream.h> int main() { const cha ...
- [Java]通过java获取计算机名
通过java获取计算机名 String hostname = "Unknown"; try { InetAddress addr; addr = InetAddress.getLo ...
- 微信小程序进行地图导航使用地图功能
之前我写过的文章当中,提过小程序的打包大小.所以特地去下载一个区域的地图的这种方法,是不存在的. 我用的导航主要使用的是应用外的导航,这篇文章可能对于非常熟悉小程序的小伙伴来说就是小case,所以只适 ...
- marathon的高可用服务自动发现和负载均衡
上一篇我们说谈了docker+zookeeper+mesos+marathon集群,本篇我们来谈谈marathon的集群和自动发现服务. marathon的服务自动发现和负载均衡有两种,1是mesos ...
- Mac之如何查看已用端口
一.苹果自带的网络分析工具查看方法: OS X 10.9 下面 网络实用工具 从实用工具目录里消失了,可能苹果认为这个程序用的人太少就取消了吧.但是对于做互联网的人还是有点用的. 启动方法 ...
- win10自带虚拟机安装CentOS7系统(转)
出处:http://blog.csdn.net/bimabushihaodongxi/article/details/53677490 话说工欲善其事,必先利其器,在我准备学习Linux之前先要完成l ...
- PHP(六)PHP和HTML混合的一种形式
- SpringMVC源码解析 - HandlerAdater - ModelAndViewContainer上下文容器
HandlerAdapter在处理请求时上下文数据的传递工作是由ModelAndViewContainer负责的. 源码注释是这样描述的: Records model and view related ...
- 如何计算服务器能够承受多大的pv?
你想建设一个能承受500万PV/每天的网站吗? 500万PV是什么概念?服务器每秒要处理多少个请求才能应对?如果计算呢? PV是什么: PV是page view的简写.PV是指页面的访问次数,每打开或 ...