前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python爬虫抓取小姐姐图片

python爬虫抓取小姐姐图片

作者头像
kevinfaith
发布2018-09-18 15:50:51
1.6K0
发布2018-09-18 15:50:51
举报
文章被收录于专栏:kevin-blogkevin-blog
代码语言:javascript
复制
知之者不如好之者,好之者不如乐之者  ----语出<<论语>>十二章
简述:

学习的过程是枯燥的,所以兴趣非常重要,但什么样的兴趣能比得过自己手打的代码经过无数次调试,成果出来的那一瞬间的喜悦呢,而学习爬虫最重要的是因为什么,当然是爬取美腻的小姐姐图片了,去tm的数据分析,数据可视化,哪有看到一张张小姐姐图片来的真是,桀桀桀~O(∩_∩)O~

思路:

先说思路,首先选用网站,恩,物色了半天,我们选取了http://www.27270.com/ent/meinvtupian/list_11_1.html网站的小姐姐图片,为啥是它呢,嘿嘿,你们懂得,痴汉笑~ 有了网站,接下来分析网站结构: 先用浏览器开发者工具,查看图片位置

代码语言:javascript
复制
<body>
....省略其他页面代码
<div>
....省略其他页面代码
<div class="MeinvTuPianBox">
<ul>
....省略其他页面代码
<li> <a href="*****" title="******" class="MMPic" target="_blank"><i><img src="*****" width="190" height="280" alt="*****"  /></i></a>
....省略其他页面代码
</li> 
....省略其他页面代码
</div>

确定好元素的位置

代码语言:javascript
复制
body > div > div class=MeinvTuPianBox > ul > li > a class=MMPic > i > img

这个简单,用BeautifulSoupd库定位一下tag元素就好了, 这里有个问题,怎么实现翻页呢,我们可是要爬取整个网站的图片呀(嘿嘿,你说什么~几张怎么可能满足的了我们,要爬就要爬完嘛,哈哈) 我们分析发现:

代码语言:javascript
复制
第一页url:http://www.27270.com/ent/meinvtupian/list_11_1.html
第二页url:http://www.27270.com/ent/meinvtupian/list_11_2.html

恩,我们发现只要改变url的数字就能实现翻页了,这个简单,基本思路 http://www.27270.com/ent/meinvtupian/list_11_%s.html' % index 只要定义一个模块,模块传递一个可变的index值就可以了.

准备:

因为要用到BeautifulSoupd这个模块,所以需要安装一下 因为我用的ubuntu18.04,所以我的安装方式是:

代码语言:javascript
复制
pip install beautifulsoup4

然后还要安装一个是beautifulsoup的解析器,关于解析器的定义,你们去看beautifulsoup的官方文档吧,它讲的比我详细. 安装方式:

代码语言:javascript
复制
pip install lxml

因为我喜欢用lxml,其实他自带有一个html.parser的解析器,但是我不怎么喜欢

代理:

然后关于代理问题,原先我是爬取西刺代理的免费http代理做代理池的,但是因为速度感人,我就没有用了,我用的自己服务器的socks5的代理,但是这样有个问题,就是ip只有两个,一个是我本地的ip,一个是我服务器的ip,访问过多还是会被服务器给封禁的,所以我就做了个单偶数的方法,单数用我自己的ip,双数用我服务器的ip,然后加了访问控制时间,这样就不会太频繁,这样应该就不会被禁止了.

代码:

话不多说,直接上代码:

代码语言:javascript
复制
from urllib.request import urlopen
import urllib.request
from bs4 import  BeautifulSoup
import os, time
import http.cookiejar
import  random 
from urllib.request import urlretrieve ,HTTPError ,urlopen,URLError
import re
import socks
import socket
import time

base_dir = './'
#下载图片
def download(url,file_name,index):
  dir =  base_dir+ 'mm' + '/'
  if not os.path.isdir(dir):
    os.makedirs(dir)
  file_name = file_name+str(index)
  dir = dir + file_name + '.jpg'
  try:
    with  urlopen(url,timeout=30) as r:
        content=r.read()
        with open(dir,'wb') as code:
            code.write(content)
    except:
    pass

#获取首页列表图库地址
def get_url_list(index,end):
  header = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0'
  }
  url = 'http://www.27270.com/ent/meinvtupian/list_11_%s.html' % index
  req = urllib.request.Request(url,headers=header)
  r = urllib.request.urlopen(req)
  soup = BeautifulSoup(r,'html.parser',from_encoding='utf-8')
  girl_list = soup.select('body > div > div.MeinvTuPianBox > ul > li > a.MMPic')
  if not girl_list:
    print('已经全部抓取完毕')
  mm_href = []
  mm_names = []
  for mpoto in:
    mm_link = mpoto.get('href') 
    mm_nick = mpoto.get('title')
    mm_href.append(mm_link)
    mm_names.append(mm_nick)
  for gril,name in zip(mm_href,mm_names):
    print(gril+name)
    time.sleep(5)
    get_url_down(gril,name,end)
  index = index + 1
  #这是我的服务器的socks5的代理,你们可以换一下,也可以用html的做opener.
  if index % 2 == 0:
    socks.set_default_proxy(socks.SOCKS5, '192.168.30.102',1080)
    socket.socket = socks.socksocket
    get_url_list(index,end)
  else:
    get_url_list(index,end)
  #如果不用socks5,就直接
  #get_url_list(index,end)
  #如果是html的代理,可以生成opener来做.但是这样后面的urllib.request.urlopen(),就要改成opener.open了
  #这个就自行百度吧,我就不说了
  if index == end:
    os._exit(0)

def get_url_down(url,name,end):
  header = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0'
  }
  req = urllib.request.Request(url,headers=header)
  r = urllib.request.urlopen(req)
  soup = BeautifulSoup(r,'html.parser',from_encoding='utf-8')
  soup_end = soup.select('body > div.warp.mar.oh > div.warp.oh > div.page-tag.oh > ul > li#pageinfo > a')
  end_down = re.findall(r"\d",str(soup_end))
  end1 = end_down[0]
  main_url = url
  index = 1
  list_index = 1
  mm_nick = photo_url(url)
  girl_down(mm_nick,name,list_index)
  for i in range(int(end1) - 1):
    if index <= int(end1):
        list_index = list_index + 1
        url2 = paging(main_url,list_index)
        print(url2)
        url_address=photo_url(url2)
        girl_down(url_address,name,list_index)
        index = index + 1
    else:
        break

#获取图片地址
def photo_url(url):
  header = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0'
  }
  req = urllib.request.Request(url,headers=header)
  r = urllib.request.urlopen(req)
  soup = BeautifulSoup(r,'html.parser',from_encoding='utf-8')
  girl_list = soup.select('body > div.warp.mar.oh > div.warp.oh > div#picBody > p img')
  list_img = girl_list[0].get('src')
  print('图片地址:%s' %list_img)
  return list_img

#提交图片地址
def girl_down(url,name,index):
  download(url,name,index)

#下一页
def paging(url,index):
  str1 = url[:-5] + '_' + str(index) + url[-5:]
  return str1

if __name__ == '__main__':
  if not os.path.isdir(base_dir):
    os.makedirs(base_dir)
get_url_list(1,191)
结尾:

然后因为我也是新手,做的有点烂,如果有建议什么的可以通过旁边的联系方式找我,一起探讨,学习. 后面会学习多线程,并发等方式,慢慢优化爬虫的速度. 后续会慢慢更新.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简述:
  • 思路:
  • 准备:
  • 代理:
  • 代码:
  • 结尾:
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档