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+django实现文件上传
Jan 17 Python
Python使用smtp和pop简单收发邮件完整实例
Jan 09 Python
python实现排序算法解析
Sep 08 Python
详解如何用django实现redirect的几种方法总结
Nov 22 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
python requests更换代理适用于IP频率限制的方法
Aug 21 Python
python实现截取屏幕保存文件,删除N天前截图的例子
Aug 27 Python
pytorch-RNN进行回归曲线预测方式
Jan 14 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
Keras搭建自编码器操作
Jul 03 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定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
如何让CI框架支持service层
2014/10/29 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
微信小程序仿通讯录功能
2020/04/09 Javascript
python实现从web抓取文档的方法
2014/09/26 Python
python获取本机mac地址和ip地址的方法
2015/04/29 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
学生信息管理系统python版
2018/10/17 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
python实现从wind导入数据
2019/12/03 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
Python直接赋值及深浅拷贝原理详解
2020/09/05 Python
Django URL参数Template反向解析
2020/11/24 Python
比利时香水网上商店:NOTINO
2018/03/28 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
网络编辑岗位职责
2014/03/18 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
对讲机的最大通讯距离是多少
2022/02/18 无线电
python 实现图片特效处理
2022/04/03 Python