Python爬虫之爬取美女图片

2017-11-20  本文已影响0人  hc_chou

需求:最近对python爬虫感兴趣,于是学习了下python爬虫并找了个网站练习,练习网址:http://www.mmjpg.com,其中每一套图都是一张一个页面,存一套图如果是手动得点翻几十个页面,但如果使用爬虫的话,就很方便了,轻轻松松就可以把美女存到硬盘了。

实验环境:

1.确定目标网址

www.mmjpg.com

2.分析网页URL变化

通过打开不同页数的页面内容后发现
第二页:http://www.mmjpg.com/home/2
第三页:http://www.mmjpg.com/home/3
每当我们点击一个页面,url改变的是最后面的数字,因此我们需要找到总页数的html代码,才能对其进行爬虫翻页

3.分析网页源代码

通过审查网页元素定位到了总页数的html元素:<a href="/home/79" class="last">最旧</a> 由此可以得出该网址的总页数为79页,接下来便可对其进行提取

4.引入所需要的库

import os
import re
import urllib2                                                                                                          
from lxml import html     

5.获取网页源代码

def get_source_page(self, url):
    '''
    返回经过lxml.html.fromstring 模块处理的<Element html at 0x36e8278>
    可以用 XPath 来过滤数据
    '''
    try:
        response = urllib2.urlopen(url, timeout=3).read()
        selector = html.fromstring(response)
    except:
        selector = None
    finally:
        return selector

6.获取总页数

def get_sum_page(self, url):
    selector = self.get_source_page(url)
    '''使用xpath提取网页中总页数的元素'''
    sum_page = selector.xpath('//div[@class="page"]//a[last()]/@href')[0].split('/')[-1]
    return sum_page

7.用总页数来组合拼接出所有页面的url,并返回包含所有url的list

def get_all_page_urls(self, sumpage):
    urls = []
    baseurl = 'http://www.mmjpg.com/home/'
    ul = baseurl.split('/')
    for page in range(1, int(sumpage) + 1):
        ul[-1] = str(page)
        url = '/'.join(ul)
        urls.append(url)
    return urls

8.获取每个图集的链接

'''由于首页图片点击进去之后还有图片,因此首页图片是一个图集链接,所以得先获取图集链接,进而获取里面的所有图片,分析网页代码得知,可对其连接进行提取,并同样返回一个list'''
def get_page_links(self, urls):
    page_links = []
    for url in urls:
        try:
            selector = self.get_source_page(url)
            lis = selector.xpath('//div[@class="pic"]//li/a/@href')
        except:
            continue
        for li in lis:
            page_links.append(li)
    return page_links

9.获取图片的src属性

def get_pic_link(self, url):
    try:
        selector = self.get_source_page(url)
        src = selector.xpath('//div[@id="content"]/a/img/@src')[0]
    except:
        src = None
    finally:
        return src

10.创建文件夹并用图集名进行命名

def mk_pic_dir(self, dirname):
    path = dirname
    if not os.path.exists(path):
        os.mkdir(path)
    return path

11.进入所有图集,并下载所有图片

def download_all_pic(self, page_links):
    for page_link in page_links:
        try:
            selector = self.get_source_page(page_link)
            album_title = selector.xpath('//div[@class="article"]/h2/text()')[0]
            sum_pic = selector.xpath('//div[@id="page"]/a[last()-1]/text()')[0]
            path = self.mk_pic_dir(album_title)
        except:
            continue
        for pic in range(1, int(sum_pic) + 1):
            try:
                print u'正在下载-->' + album_title + u'-->第' + str(pic) + u'张美图...'
                pic_link = page_link + '/' + str(pic)
                src = self.get_pic_link(pic_link)
                filename = '%s.jpg' % (pic)
            except:
                continue
            else:
                try:
                    '''增加打开图片链接时的头部referer属性'''
                    req = urllib2.Request(src)
                    req.add_header('Referer', 'http://img.mmjpg.com/')
                    '''写入文件'''
                    with open(path + '/' + filename, 'wb') as fp:
                        fp.write(urllib2.urlopen(src, timeout=3).read())
                 except:
                    continue

12.大功告成,运行代码

编辑器执行过程
以图集名命名的文件夹
对应图集里面的所有图片

本实验的完整代码在Github上,欢迎fork

上一篇下一篇

猜你喜欢

热点阅读