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 相关文章推荐
Python3实现生成随机密码的方法
Aug 23 Python
python中函数传参详解
Jul 03 Python
Python实现简单的四则运算计算器
Nov 02 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
python操作文件的参数整理
Jun 11 Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 Python
python 表格打印代码实例解析
Oct 12 Python
python 实现多线程下载视频的代码
Nov 15 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
Jul 01 Python
Python中三维坐标空间绘制的实现
Sep 22 Python
python实现跨年表白神器--你值得拥有
Jan 04 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数组总结篇(一)
2008/09/30 PHP
php生成静态页面的简单示例
2014/04/17 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
介绍Python中几个常用的类方法
2015/04/08 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
python魔法方法-属性访问控制详解
2016/07/25 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
python实现PCA降维的示例详解
2020/02/24 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
详解python中的闭包
2020/09/07 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
初中生评语大全
2014/04/24 职场文书
项目合作意向书模板
2014/07/29 职场文书
2014年党员整改措施
2014/10/24 职场文书
实习科室评语
2015/01/04 职场文书
英语演讲开场白
2015/05/29 职场文书
校园安全教育心得体会
2016/01/15 职场文书