网络爬虫之网站图片爬取-python实现
版本1.5
本次简单添加了四路多线程(由于我电脑CPU是四核的),速度飙升。本想试试xPath,但发现反倒是多此一举,故暂不使用
#-*- coding:utf-8 -*-
import re,urllib,os,urllib2,chardet,requests,time
from multiprocessing.dummy import Pool def urllink(link): #网页HTML获取以及编码转换
html_1 = urllib2.urlopen(link,timeout=120).read()
encoding_dict = chardet.detect(html_1)
web_encoding = encoding_dict['encoding']
if web_encoding == 'utf-8' or web_encoding == 'UTF-8':
html = html_1
else :
html = html_1.decode('gbk','ignore').encode('utf-8')
return html def downloadpic(j):
href = 'http://www.dazui88.com' + re.search('href="(.*?).html', j).group(1) # 每一套总网址
label = (re.findall('alt="(.*?)"', j, re.S))[0].strip() # 每一套名称
path = unicode(r'D:\pachong\pans\%s' % (label), 'utf-8') # 每一套文件夹
print '开始下载,%s' % (label)
if not os.path.exists(path):
os.mkdir(path)
p = 0
for k in range(1, 100): # 爬取其中每一张图片
hrefnew = href
if k is not 1:
hrefnew = href + '_%d' % k
hrefnew += '.html'
try: # 如果此页不存在,表示已经爬完了,开始爬下一组
html2 = urllink(hrefnew)
except:
print u'该套下载完毕\n'
break;
try: # 如果该页中图片丢失,则开始爬下一张
picurl = re.findall('img alt.*?src="(.*?)"', html2)
except:
print u'该处丢失一张'
continue
for n in picurl: # 由于可能存在多张,故需一一下载
p += 1
if not re.findall('http', n, re.S): # 部分图片缺少前缀部分,故需判断后添加
n = 'http://www.dazui88.com' + n
print u'正在下载图片,图片地址:' + n
retu = requests.get(n, stream=True)
picpath = unicode(r'D:\pachong\pans\%s\%s' % (label, str(p)) + '.jpg', 'utf-8')
file = open(picpath, 'wb')
for chunk in retu.iter_content(chunk_size=1024 * 8):
if chunk:
file.write(chunk)
file.flush()
file.close() def spider():
for i in range(2,46): #爬取总共的主页面数
link1="http://www.dazui88.com/tag/pans/list_86_%d.html"%i
html=urllink(link1)
plist=re.findall("<p>.*?</p>",html,re.S)
pool = Pool(4)
pool.map(downloadpic,plist)
pool.close()
pool.join() if __name__=="__main__":
spider()
***************************** 分割线 *********************************
版本1.2
此次添加若干功能,如下:
1.首先,终于解决了中文文件夹乱码的问题,现支持中文文件夹自动创建,我想吐槽一句,python的中文编码处理真的是稀烂,各种迷
2.美化脚本的输出,使其更加直观美观
3.解决了一个页面多张图片的下载问题
4.修复部分图片地址缺少前缀导致无法下载的问题
***************************** 分割线 *********************************
版本1.0
今天上午开始学了学爬虫技术。下午开始着手写了第一个网站爬虫脚本。
这次我要爬的是随手找的一个主要是妹子图片的网站,目标是把其中某个分类下的所有妹子套图都爬下来
(举例附网址:http://www.dazui88.com/tag/toutiao/list_130_1.html)
老司机们应该知道,一套图一般都有几十张,但这类网站一般一页只会放出一张或者几张,这样一来我们浏览图片时的观感就会大大下降,
因此一次把图片全都爬下来会方便的多。
实现时的技术要求与难点:
总的老说目前做的还比较粗糙,但完全够用,主要是拿来练练手。
1.本想以每套图片的名字作为文件夹,但是由于中文有乱码,暂时未实现;
2.下载图片使用的还是requests库,貌似 beautifulsoup库会更好一点,但暂未尝试;
3.由于并没有编写多线程,以及缓冲池之类的,速度会比较慢,但还可以接受;
4.脚本存在一定问题,如果网站其中一张图片丢失,该套图片的剩下部分会被跳过,可解决,但暂未解决;
5.脚本还可以做成软件的形式,但较耗时,有空再说;
6.由于此次爬取的网站其他版块的url结构基本一致,所以花上几秒钟改一下,就能很快爬取其他的图片,甚至整个站所有的图片,但是速度有待改进。
代码实现:
#-*- coding:utf-8 -*-
import re,urllib,os,urllib2,chardet,requests def urllink(link): #网页HTML获取以及编码转换
html_1 = urllib2.urlopen(link,timeout=120).read()
encoding_dict = chardet.detect(html_1)
web_encoding = encoding_dict['encoding']
if web_encoding == 'utf-8' or web_encoding == 'UTF-8':
html = html_1
else :
html = html_1.decode('gbk','ignore').encode('utf-8')
return html def spider():
m=0
for i in range(1,12): #爬取总共的主页面数
link1="http://www.dazui88.com/tag/tgod/list_80_%d.html"%i
html=urllink(link1)
plist=re.findall("<p>.*?</p>",html,re.S)
for j in plist: #开始爬其中每一套
m+=1
href = 'http://www.dazui88.com' + re.search('href="(.*?).html', j).group(1) #每一套总网址
label = (re.findall('alt="(.*?)"',j,re.S))[0].strip() #每一套名称
path = unicode(r'D:\pachong\tgod\%s %s' %( str(m),label), 'utf-8') #每一套文件夹
print '开始下载第%d套,%s'%(m,label)
if not os.path.exists(path):
os.mkdir(path)
p=0
for k in range(1,100): #爬取其中每一张图片
hrefnew=href
if k is not 1:
hrefnew=href+'_%d'%k
hrefnew+='.html'
try: #如果此页不存在,表示已经爬完了,开始爬下一组
html2=urllink(hrefnew)
except:
print u'该套下载完毕\n'
break;
try: #如果该页中图片丢失,则开始爬下一张
picurl=re.findall('img alt.*?src="(.*?)"',html2)
except:
print u'该处丢失一张'
continue
for n in picurl: #由于可能存在多张,故需一一下载
p+=1
print u'正在下载图片,图片地址:'+n
retu=requests.get(n,stream=True)
picpath=unicode(r'D:\pachong\tgod\%s %s\%s'%(str(m),label,str(p))+'.jpg','utf-8')
file=open(picpath,'wb')
for chunk in retu.iter_content(chunk_size=1024*8):
if chunk:
file.write(chunk)
file.flush()
file.close() if __name__=="__main__":
spider()
网络爬虫之网站图片爬取-python实现的更多相关文章
- 爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式
爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 目录 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy ...
- Python网络爬虫(6)--爬取淘宝模特图片
经过前面的一些基础学习,我们大致知道了如何爬取并解析一个网页中的信息,这里我们来做一个更有意思的事情,爬取MM图片并保存.网址为https://mm.taobao.com/json/request_t ...
- python网络爬虫第三弹(<爬取get请求的页面数据>)
一.urllib库 urllib是python自带的一个用于爬虫的库,其主要作用就是通过代码模拟浏览器发送请求,其常被用到的子模块在 python3中的为urllib.request 和 urllib ...
- Python网络爬虫入门实战(爬取最近7天的天气以及最高/最低气温)
_ 前言 本文文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Bo_wen 最近两天学习了一下python,并自己写了一个 ...
- python网络爬虫(7)爬取静态数据详解
目的 爬取http://seputu.com/数据并存储csv文件 导入库 lxml用于解析解析网页HTML等源码,提取数据.一些参考:https://www.cnblogs.com/zhangxin ...
- python 网络爬虫(一)爬取天涯论坛评论
我是一个大二的学生,也是刚接触python,接触了爬虫感觉爬虫很有趣就爬了爬天涯论坛,中途碰到了很多问题,就想把这些问题分享出来, 都是些简单的问题,希望大佬们以宽容的眼光来看一个小菜鸟
- Python网络爬虫——Appuim+夜神模拟器爬取得到APP课程数据
一.背景介绍 随着生产力和经济社会的发展,温饱问题基本解决,人们开始追求更高层次的精神文明,开始愿意为知识和内容付费.从2016年开始,内容付费渐渐成为时尚. 罗辑思维创始人罗振宇全力打造" ...
- python网络爬虫(6)爬取数据静态
爬取静态数据并存储json import requests import chardet from bs4 import BeautifulSoup import json user_agent='M ...
- Python爬虫入门——使用requests爬取python岗位招聘数据
爬虫目的 使用requests库和BeautifulSoup4库来爬取拉勾网Python相关岗位数据 爬虫工具 使用Requests库发送http请求,然后用BeautifulSoup库解析HTML文 ...
随机推荐
- 当SQL Server的实例位于集群的特定节点时,数据库无法远程访问
搭建好了一个集群环境,发现当SQL Server的实例位于集群的其中一个节点时,数据库无法远程访问,报如下错误.但在另一个 节点时,数据库访问正常. 标题: 连接到服务器 -------------- ...
- 《CSS世界》读书笔记(十)
<!-- <CSS世界>张鑫旭著 --> 温和的padding属性 因为默认的box-sizing是content-box,所以使用padding会增加元素的尺寸. 尺寸表现对 ...
- Django框架---- 信号
Django中的信号及其用法 Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Django中内置的sign ...
- JS中几种常见的高阶函数
高阶函数:英文叫Higher-order function.JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数 ...
- 2019/3/28 wen 继承
- MySQL5.7 Dockerfile
#Dockerfile for mysql5.7 FROM centos COPY ["src","/src"] RUN groupadd -g 1003 my ...
- Docker Overlay 应用部署
Docker Overlay 部署条件 要想使用Docker原生Overlay网络,需要满足以下任意条件: 1.Docker运行在Swarm模式 2.使用键值存储的Docker主机集群 本次部署使用键 ...
- Linux I/O 调度算法
IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调度器也被叫做电梯. (elevator)而相应的算法也就被叫做电梯算法.而Li ...
- 【论文笔记】Dynamic Routing Between Capsules
Dynamic Routing Between Capsules 2018-09-16 20:18:30 Paper:https://arxiv.org/pdf/1710.09829.pdf%20 P ...
- [译]RabbitMQ教程C#版 - "Hello World"
先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...