爬虫实战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 ...
随机推荐
- LevelDB Filters
[LevelDB Filters] Because of the way leveldb data is organized on disk, a single Get() call may invo ...
- Socket.IO for Unity 简要介绍
在项目中使用到了Socket.IO for unity这个Asset Store上免费的库,这里将简要的介绍一下它的结构,已经使用中的注意事项. 目录结构 上面为包的目录结构,简单的介绍一下具体的内容 ...
- leetcode 20 Valid Parentheses 有效的括号
描述: 给定一些列括号,判断其有效性,即左括号有对应的有括号,括号种类只为小,中,大括号. 解决: 用栈. bool isValid(string s) { stack<char> st; ...
- sqlserver datetime的bug?
sqlserver datetime 的毫秒的个位似乎存在bug,只有0.3.7这三个值,比如: 2018-01-20 23:59:59:999会变成2018-01-21 00:00:00.000 2 ...
- Spring Boot 响应jsp
添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/ ...
- 6-关于#include<bits/stdc++.h>
万能头文件#include<bits/stdc++.h> (转载) 最近在打cf时赛后翻阅别人的代码总是会发现一个陌生而奇怪的头文件#include<bits/stdc++.h& ...
- Windows pip安装失败:no module named pkg_resources
通常是Setuptools安装出错,下载以下ez_setup.py文件后,先执行:ez_setup.py -U setuptools 重新安装setuptools 通过此ez_setup.py pip ...
- linux下PHP7安装memcache
1.memcache服务器的安装 .分别把memcached和libevent下载回来,放到 /tmp 目录下: # cd /tmp # wget http://www.danga.com/memca ...
- Android应用开发环境的搭建和使用
主要包括Android SDK.Android开发工具:也包括如何使用Android提供的ADB.DDMS.AAPT.DX等工具,掌握这些工具是开发Android应用的基础技能. 1.Android的 ...
- BI失败的原因
最最重要的, 要有个清晰的目标和范围. 有些客户, 完全脑袋一热开始上BI, 连根本上要BI来解决什么问题都不知道.作为企业的CIO, 首先要知道上BI项目是不是符合企业的战略目标, 是不是能给企业带 ...