python爬虫抓取小姐姐图片

知之者不如好之者,好之者不如乐之者  ----语出<<论语>>十二章

简述:

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

思路:

先说思路,首先选用网站,恩,物色了半天,我们选取了某个模特网站。
有了网站,接下来分析网站结构:
先用浏览器开发者工具,查看图片位置

<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>

确定好元素的位置

body > div > div class=MeinvTuPianBox > ul > li > a class=MMPic > i > img

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

第一页url:http://www.xxxx.com/ent/meinvtupian/list_11_1.html
第二页url:http://www.xxxxx.com/ent/meinvtupian/list_11_2.html

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

准备:

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

pip install beautifulsoup4

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

pip install lxml

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

代理:

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

代码:

话不多说,直接上代码:

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.xxxxxx.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)

结尾:

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

文章目录
  1. 1. 简述:
  2. 2. 思路:
  3. 3. 准备:
  4. 4. 代理:
  5. 5. 代码:
  6. 6. 结尾: