爬虫实战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 ...
随机推荐
- 股票F10
[股票F10] 股票非行情类的基本面资料统称为股票F10 在各种金融行情终端软件中,用户通过键盘上的F10快捷键,可迅速查看上市公司的非行情信息,诸如:公司概况.财务数据.公司公告.公司新闻.经营 ...
- Windows本地Linux虚拟机ping不通的解决办法
解决办法:启动虚拟机双网卡支持: 网卡1:Host-Only网络 网卡2:NAT网络 设置好以后,可以在Linux主机中ifconfig查看本地Host-Only的网络地址,与电脑中的地址应该是同一网 ...
- php从数组中取出一段 之 array_slice
array array_slice ( array $array , int $offset [, int $length [, bool $preserve_keys ]] ) array_slic ...
- linux下PHP7安装memcache
1.memcache服务器的安装 .分别把memcached和libevent下载回来,放到 /tmp 目录下: # cd /tmp # wget http://www.danga.com/memca ...
- webform版部分视图与请求拦截
.主控前台页面 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFor ...
- C#使用互斥量(Mutex)实现多进程并发操作时多进程间线程同步操作(进程同步)的简单示例代码及使用方法
本文主要是实现操作系统级别的多进程间线程同步(进程同步)的示例代码及测试结果.代码经过测试,可供参考,也可直接使用. 承接上一篇博客的业务场景[C#使用读写锁三行代码简单解决多线程并发写入文件时线程同 ...
- java如何集成支付宝移动快捷支付功能
项目需要,需要在客户端集成支付宝接口.第一次集成,过程还是挺简单的,不过由于支付宝官方文档写的不够清晰,也是走了一些弯路,下面把过程写出来分享给大家.就研究了一下:因为使用支付宝接口,就需要到支付宝官 ...
- 整理悬浮在列表中a元素时改变a元素上下边框颜色的问题。
整理一下当悬浮在a元素上时a的上下边颜色改变,并且里面的内容不会移动,下面是PSD图效果区域: 刚开始我先给A元素加了上下边框和颜色,利用a:hover改变a元素上下的边框颜色,但是第一个a元素的下边 ...
- UIWebView清除缓存和cookie[转]
现在项目遇到一个问题,游戏底层用Cocos2d-x,公告UI实现是用的UIWebView, 然后第一次在有网络的环境下运行公告UI,会加载url链接,同时就会自动存入缓存,当下次手机没有网络的环境下, ...
- Vivado安装教程
Vivado的各个版本的安流程其实都差不多,本教程用Vivado2016.4为例进行安装,同样适用于之前和之后的各个版本. 下载好安装包后打开,双击xsetup.exe运行安装程序 弹出的窗口,提示现 ...