Python制作爬虫抓取美女图


Posted in Python onJanuary 20, 2016

作为一个新世纪有思想有文化有道德时刻准备着的?潘磕星嗄辏?谙衷谡庋?桓錾缁嶂校?奶畚掖舐?サ种拼蟀俣鹊那疤嵯拢?皇露?仙贤?涔?Y看看斗鱼翻翻美女图片那是必不可少的,可是美图虽多翻页费劲!今天我们就搞个爬虫把美图都给扒下来!本次实例有2个:煎蛋上的妹子图,某网站的rosi图。我只是一个学习python的菜鸟,技术不可耻,技术是无罪的!!!

煎蛋:

先说说程序的流程:获取煎蛋妹子图URL,得到网页代码,提取妹子图片地址,访问图片地址并将图片保存到本地。Ready? 先让我们看看煎蛋妹子网页:

Python制作爬虫抓取美女图

我们得到URL为:http://jandan.net/ooxx/page-1764#comments 1764就是页码, 首先我们要得到最新的页码,然后向前寻找,然后得到每页中图片的url。下面我们分析网站代码写出正则表达式!

Python制作爬虫抓取美女图

根据之前文章的方法我们写出如下函数getNewPage:

def __getNewPage(self):
    pageCode = self.Get(self.__Url)
    type = sys.getfilesystemencoding()
    pattern = re.compile(r'<div .*?cp-pagenavi">.*?<span .*?current-comment-page">\[(.*?)\]</span>',re.S)
    newPage = re.search(pattern,pageCode.decode("UTF-8").encode(type))
    print pageCode.decode("UTF-8").encode(type)
    if newPage != None:
      return newPage.group(1)
    return 1500

不要问我为什么如果失败返回1500。。。 因为煎蛋把1500页之前的图片都给吃了。 你也可以返回0。接下来是图片的

Python制作爬虫抓取美女图

def __getAllPicUrl(self,pageIndex):
    realurl = self.__Url + "page-" + str(pageIndex) + "#comments"
    pageCode = self.Get(realurl)
    type = sys.getfilesystemencoding()
    pattern = re.compile('<p>.*?<a .*?view_img_link">.*?</a>.*?<img src="(.*?)".*?</p>',re.S)
    items = re.findall(pattern,pageCode.decode("UTF-8").encode(type))
    for item in items:
      print item

好了,得到了图片地址,接下来就是访问图片地址然后保存图片了:

def __savePics(self,img_addr,folder):
    for item in img_addr:
      filename = item.split('/')[-1]
      print "正在保存图片:" + filename
      with open(filename,'wb') as file:
        img = self.Get(item)
        file.write(img)

当你觉得信心满满的时候,一定会有一盆冷水浇到你的头上,毕竟程序就是这样,考验你的耐性,打磨你的自信。你测试了一会儿,然后你发现你重启程序后再也无法获取最新页码,你觉得我什么也没动啊为什么会这样。别着急,我们将得到的网页代码打印出来看看:

Python制作爬虫抓取美女图

看到了吧,是服务器感觉你不像浏览器访问的结果把你的ip给屏蔽了。 真是给跪了,辛辛苦苦码一年,屏蔽回到解放前!那么这个如何解决呢,答:换ip 找代理。接下来我们要改一下我们的HttpClient.py 将里面的opener设置下代理服务器。具体代理服务器请自行百度之,关键字:http代理 。 想找到一个合适的代理也不容易 自己ie Internet选项挨个试试,测试下网速。

# -*- coding: utf-8 -*-
import cookielib, urllib, urllib2, socket
import zlib,StringIO
class HttpClient:
 __cookie = cookielib.CookieJar()
 __proxy_handler = urllib2.ProxyHandler({"http" : '42.121.6.80:8080'})#设置代理服务器与端口
 __req = urllib2.build_opener(urllib2.HTTPCookieProcessor(__cookie),__proxy_handler)#生成opener
 __req.addheaders = [
  ('Accept', 'application/javascript, */*;q=0.8'),
  ('User-Agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)')
 ]
 urllib2.install_opener(__req)

 def Get(self, url, refer=None):
  try:
   req = urllib2.Request(url)
   #req.add_header('Accept-encoding', 'gzip')
   if not (refer is None):
    req.add_header('Referer', refer)
   response = urllib2.urlopen(req, timeout=120)
   html = response.read()
   #gzipped = response.headers.get('Content-Encoding')
   #if gzipped:
   #  html = zlib.decompress(html, 16+zlib.MAX_WBITS)
   return html
  except urllib2.HTTPError, e:
   return e.read()
  except socket.timeout, e:
   return ''
  except socket.error, e:
   return ''

然后,就可以非常愉快的查看图片了。不过用了代理速度好慢。。。可以设置timeout稍微长一点儿,防止图片下载不下来!

Python制作爬虫抓取美女图

好了,rosi的下篇文章再放!现在是时候上一波代码了:

# -*- coding: utf-8 -*-
import cookielib, urllib, urllib2, socket
import zlib,StringIO
class HttpClient:
 __cookie = cookielib.CookieJar()
 __proxy_handler = urllib2.ProxyHandler({"http" : '42.121.6.80:8080'})
 __req = urllib2.build_opener(urllib2.HTTPCookieProcessor(__cookie),__proxy_handler)
 __req.addheaders = [
  ('Accept', 'application/javascript, */*;q=0.8'),
  ('User-Agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)')
 ]
 urllib2.install_opener(__req)

 def Get(self, url, refer=None):
  try:
   req = urllib2.Request(url)
   req.add_header('Accept-encoding', 'gzip')
   if not (refer is None):
    req.add_header('Referer', refer)
   response = urllib2.urlopen(req, timeout=120)
   html = response.read()
   gzipped = response.headers.get('Content-Encoding')
   if gzipped:
     html = zlib.decompress(html, 16+zlib.MAX_WBITS)
   return html
  except urllib2.HTTPError, e:
   return e.read()
  except socket.timeout, e:
   return ''
  except socket.error, e:
   return ''

 def Post(self, url, data, refer=None):
  try:
   #req = urllib2.Request(url, urllib.urlencode(data))
   req = urllib2.Request(url,data)
   if not (refer is None):
    req.add_header('Referer', refer)
   return urllib2.urlopen(req, timeout=120).read()
  except urllib2.HTTPError, e:
   return e.read()
  except socket.timeout, e:
   return ''
  except socket.error, e:
   return ''

 def Download(self, url, file):
  output = open(file, 'wb')
  output.write(urllib2.urlopen(url).read())
  output.close()

# def urlencode(self, data):
#  return urllib.quote(data)

 def getCookie(self, key):
  for c in self.__cookie:
   if c.name == key:
    return c.value
  return ''

 def setCookie(self, key, val, domain):
  ck = cookielib.Cookie(version=0, name=key, value=val, port=None, port_specified=False, domain=domain, domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)
  self.__cookie.set_cookie(ck)
#self.__cookie.clear() clean cookie
# vim : tabstop=2 shiftwidth=2 softtabstop=2 expandtab

HttpClient
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from HttpClient import HttpClient
import sys,re,os
class JianDan(HttpClient):
  def __init__(self):
    self.__pageIndex = 1500 #之前的图片被煎蛋吞了
    self.__Url = "http://jandan.net/ooxx/"
    self.__floder = "jiandan"
  def __getAllPicUrl(self,pageIndex):
    realurl = self.__Url + "page-" + str(pageIndex) + "#comments"
    pageCode = self.Get(realurl)
    type = sys.getfilesystemencoding()
    pattern = re.compile('<p>.*?<a .*?view_img_link">.*?</a>.*?<img src="(.*?)".*?</p>',re.S)
    items = re.findall(pattern,pageCode.decode("UTF-8").encode(type))
    for item in items:
      print item
    self.__savePics(items,self.__floder)

  def __savePics(self,img_addr,folder):
    for item in img_addr:
      filename = item.split('/')[-1]
      print "正在保存图片:" + filename
      with open(filename,'wb') as file:
        img = self.Get(item)
        file.write(img)

  def __getNewPage(self):
    pageCode = self.Get(self.__Url)
    type = sys.getfilesystemencoding()
    pattern = re.compile(r'<div .*?cp-pagenavi">.*?<span .*?current-comment-page">\[(.*?)\]</span>',re.S)
    newPage = re.search(pattern,pageCode.decode("UTF-8").encode(type))
    print pageCode.decode("UTF-8").encode(type)
    if newPage != None:
      return newPage.group(1)
    return 1500

  def start(self):
    isExists=os.path.exists(self.__floder)#检测是否存在目录
    print isExists
    if not isExists:
      os.mkdir(self.__floder)
    os.chdir(self.__floder)
    page = int(self.__getNewPage())
    for i in range(self.__pageIndex,page):
      self.__getAllPicUrl(i)

if __name__ == '__main__':
  jd = JianDan()
  jd.start()

JianDan
Python 相关文章推荐
python实现简单socket程序在两台电脑之间传输消息的方法
Mar 13 Python
Django中使用locals()函数的技巧
Jul 16 Python
利用 Monkey 命令操作屏幕快速滑动
Dec 07 Python
python里使用正则表达式的组嵌套实例详解
Oct 24 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
python的常见矩阵运算(小结)
Aug 07 Python
用Python画一个LinkinPark的logo代码实例
Sep 10 Python
将python安装信息加入注册表的示例
Nov 20 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 #Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
Jan 20 #Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
Jan 20 #Python
使用python实现省市三级菜单效果
Jan 20 #Python
八大排序算法的Python实现
Jan 28 #Python
详解C++编程中一元运算符的重载
Jan 19 #Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 #Python
You might like
用PHP制作静态网站的模板框架(四)
2006/10/09 PHP
第十一节--重载
2006/11/16 PHP
php学习之 认清变量的作用范围
2010/01/26 PHP
发一个php简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
js有序数组的连接问题
2013/10/01 Javascript
JavaScript数组随机排列实现随机洗牌功能
2015/03/19 Javascript
AngularJS快速入门
2015/04/02 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
初探nodeJS
2017/01/24 NodeJs
layer弹出层框架alert与msg详解
2017/03/14 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
解决python flask中config配置管理的问题
2019/07/26 Python
10张动图学会python循环与递归问题
2021/02/06 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
社保委托书怎么写
2014/08/02 职场文书
食品药品安全责任书
2015/05/11 职场文书
工作年限证明模板
2015/06/15 职场文书
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python