版本1.5

本次简单添加了四路多线程(由于我电脑CPU是四核的),速度飙升。本想试试xPath,但发现反倒是多此一举,故暂不使用

  1. #-*- coding:utf-8 -*-
  2. import re,urllib,os,urllib2,chardet,requests,time
  3. from multiprocessing.dummy import Pool
  4.  
  5. def urllink(link): #网页HTML获取以及编码转换
  6. html_1 = urllib2.urlopen(link,timeout=120).read()
  7. encoding_dict = chardet.detect(html_1)
  8. web_encoding = encoding_dict['encoding']
  9. if web_encoding == 'utf-8' or web_encoding == 'UTF-8':
  10. html = html_1
  11. else :
  12. html = html_1.decode('gbk','ignore').encode('utf-8')
  13. return html
  14.  
  15. def downloadpic(j):
  16. href = 'http://www.dazui88.com' + re.search('href="(.*?).html', j).group(1) # 每一套总网址
  17. label = (re.findall('alt="(.*?)"', j, re.S))[0].strip() # 每一套名称
  18. path = unicode(r'D:\pachong\pans\%s' % (label), 'utf-8') # 每一套文件夹
  19. print '开始下载,%s' % (label)
  20. if not os.path.exists(path):
  21. os.mkdir(path)
  22. p = 0
  23. for k in range(1, 100): # 爬取其中每一张图片
  24. hrefnew = href
  25. if k is not 1:
  26. hrefnew = href + '_%d' % k
  27. hrefnew += '.html'
  28. try: # 如果此页不存在,表示已经爬完了,开始爬下一组
  29. html2 = urllink(hrefnew)
  30. except:
  31. print u'该套下载完毕\n'
  32. break;
  33. try: # 如果该页中图片丢失,则开始爬下一张
  34. picurl = re.findall('img alt.*?src="(.*?)"', html2)
  35. except:
  36. print u'该处丢失一张'
  37. continue
  38. for n in picurl: # 由于可能存在多张,故需一一下载
  39. p += 1
  40. if not re.findall('http', n, re.S): # 部分图片缺少前缀部分,故需判断后添加
  41. n = 'http://www.dazui88.com' + n
  42. print u'正在下载图片,图片地址:' + n
  43. retu = requests.get(n, stream=True)
  44. picpath = unicode(r'D:\pachong\pans\%s\%s' % (label, str(p)) + '.jpg', 'utf-8')
  45. file = open(picpath, 'wb')
  46. for chunk in retu.iter_content(chunk_size=1024 * 8):
  47. if chunk:
  48. file.write(chunk)
  49. file.flush()
  50. file.close()
  51.  
  52. def spider():
  53. for i in range(2,46): #爬取总共的主页面数
  54. link1="http://www.dazui88.com/tag/pans/list_86_%d.html"%i
  55. html=urllink(link1)
  56. plist=re.findall("<p>.*?</p>",html,re.S)
  57. pool = Pool(4)
  58. pool.map(downloadpic,plist)
  59. pool.close()
  60. pool.join()
  61.  
  62. if __name__=="__main__":
  63. 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结构基本一致,所以花上几秒钟改一下,就能很快爬取其他的图片,甚至整个站所有的图片,但是速度有待改进。

代码实现:

 

  1. #-*- coding:utf-8 -*-
  2. import re,urllib,os,urllib2,chardet,requests
  3.  
  4. def urllink(link): #网页HTML获取以及编码转换
  5. html_1 = urllib2.urlopen(link,timeout=120).read()
  6. encoding_dict = chardet.detect(html_1)
  7. web_encoding = encoding_dict['encoding']
  8. if web_encoding == 'utf-8' or web_encoding == 'UTF-8':
  9. html = html_1
  10. else :
  11. html = html_1.decode('gbk','ignore').encode('utf-8')
  12. return html
  13.  
  14. def spider():
  15. m=0
  16. for i in range(1,12): #爬取总共的主页面数
  17. link1="http://www.dazui88.com/tag/tgod/list_80_%d.html"%i
  18. html=urllink(link1)
  19. plist=re.findall("<p>.*?</p>",html,re.S)
  20. for j in plist: #开始爬其中每一套
  21. m+=1
  22. href = 'http://www.dazui88.com' + re.search('href="(.*?).html', j).group(1) #每一套总网址
  23. label = (re.findall('alt="(.*?)"',j,re.S))[0].strip() #每一套名称
  24. path = unicode(r'D:\pachong\tgod\%s %s' %( str(m),label), 'utf-8') #每一套文件夹
  25. print '开始下载第%d套,%s'%(m,label)
  26. if not os.path.exists(path):
  27. os.mkdir(path)
  28. p=0
  29. for k in range(1,100): #爬取其中每一张图片
  30. hrefnew=href
  31. if k is not 1:
  32. hrefnew=href+'_%d'%k
  33. hrefnew+='.html'
  34. try: #如果此页不存在,表示已经爬完了,开始爬下一组
  35. html2=urllink(hrefnew)
  36. except:
  37. print u'该套下载完毕\n'
  38. break;
  39. try: #如果该页中图片丢失,则开始爬下一张
  40. picurl=re.findall('img alt.*?src="(.*?)"',html2)
  41. except:
  42. print u'该处丢失一张'
  43. continue
  44. for n in picurl: #由于可能存在多张,故需一一下载
  45. p+=1
  46. print u'正在下载图片,图片地址:'+n
  47. retu=requests.get(n,stream=True)
  48. picpath=unicode(r'D:\pachong\tgod\%s %s\%s'%(str(m),label,str(p))+'.jpg','utf-8')
  49. file=open(picpath,'wb')
  50. for chunk in retu.iter_content(chunk_size=1024*8):
  51. if chunk:
  52. file.write(chunk)
  53. file.flush()
  54. file.close()
  55.  
  56. if __name__=="__main__":
  57. spider()

  

 

网络爬虫之网站图片爬取-python实现的更多相关文章

  1. 爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式

    爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 目录 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy ...

  2. Python网络爬虫(6)--爬取淘宝模特图片

    经过前面的一些基础学习,我们大致知道了如何爬取并解析一个网页中的信息,这里我们来做一个更有意思的事情,爬取MM图片并保存.网址为https://mm.taobao.com/json/request_t ...

  3. python网络爬虫第三弹(<爬取get请求的页面数据>)

    一.urllib库 urllib是python自带的一个用于爬虫的库,其主要作用就是通过代码模拟浏览器发送请求,其常被用到的子模块在 python3中的为urllib.request 和 urllib ...

  4. Python网络爬虫入门实战(爬取最近7天的天气以及最高/最低气温)

    _ 前言 本文文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Bo_wen   最近两天学习了一下python,并自己写了一个 ...

  5. python网络爬虫(7)爬取静态数据详解

    目的 爬取http://seputu.com/数据并存储csv文件 导入库 lxml用于解析解析网页HTML等源码,提取数据.一些参考:https://www.cnblogs.com/zhangxin ...

  6. python 网络爬虫(一)爬取天涯论坛评论

    我是一个大二的学生,也是刚接触python,接触了爬虫感觉爬虫很有趣就爬了爬天涯论坛,中途碰到了很多问题,就想把这些问题分享出来, 都是些简单的问题,希望大佬们以宽容的眼光来看一个小菜鸟

  7. Python网络爬虫——Appuim+夜神模拟器爬取得到APP课程数据

    一.背景介绍 随着生产力和经济社会的发展,温饱问题基本解决,人们开始追求更高层次的精神文明,开始愿意为知识和内容付费.从2016年开始,内容付费渐渐成为时尚. 罗辑思维创始人罗振宇全力打造" ...

  8. python网络爬虫(6)爬取数据静态

    爬取静态数据并存储json import requests import chardet from bs4 import BeautifulSoup import json user_agent='M ...

  9. Python爬虫入门——使用requests爬取python岗位招聘数据

    爬虫目的 使用requests库和BeautifulSoup4库来爬取拉勾网Python相关岗位数据 爬虫工具 使用Requests库发送http请求,然后用BeautifulSoup库解析HTML文 ...

随机推荐

  1. P1996 约瑟夫问题

    P1996 约瑟夫问题 广度优先搜索 我竟然寄几做对了 这个题用到了队列 下面详细解释: 我的代码: #include<iostream> #include<cstdio> # ...

  2. C# 生成 COM控件

    C#编写COM组件 软件:Microsoft VisualStudio 2010 1.新建一个类库项目 2.将Class1.cs改为我们想要的名字(例如:MyClass.cs) 问是否同时给类改名,确 ...

  3. wrap

    import 'package:flutter/material.dart'; void main() { runApp(MaterialApp(home: new MyApp())); } clas ...

  4. bzoj3437 小P的牧场(斜率优化dp)

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2025  Solved: 1110[Submit][Status][Discu ...

  5. 02: OpenStack

    1.1 OpenStack各组件 1.Horizon(控制台),又名Dashboard 就是web展示界面操作平台,方便用户交互的 2.Nova(计算) 负责创建,调度,销毁云主机 3.Neutron ...

  6. 破解微信防盗链&微信公众号文章爬取方案

    破解微信图文防盗链:https://www.cnblogs.com/xsxshmily/p/8000043.html 图片解除防盗链:https://blog.csdn.net/show_ljw/ar ...

  7. 北京动点飞扬软件招募【Android全职工程师】

    要求: 1 至少半年2年以上android开发经验,能力第一,学历不限 2 至少5个以上正规app开发经验 3 项目周期12个月左右,要求一周内到岗 4 有意向者简历请发邮箱372900288@qq. ...

  8. 初始FreeMake

    此文章是观看视频学习的,只是一点点基础还不太深 视频地址:http://www.icoolxue.com/play/5773 源码:码云:https://gitee.com/wmjGood/FreeM ...

  9. Asp.net core 学习笔记 2.1 升级到 2.2

    首先跟着官网 step by step https://docs.microsoft.com/en-us/aspnet/core/migration/21-to-22?view=aspnetcore- ...

  10. pycharm 倒入request包方法(新手)

    1.先安装request模块,在pycharm import,但是怎么也倒不进去,咨询了开发,原来需要把包倒入到pycharm 编译器里面才可以import 成功,具体操作步骤如下 首先确认下自己电脑 ...