JB的Python之旅-爬虫篇-MM图

前言:

某群里某大学生每天在群里说XX网的图片好看,每天喊爬,但又不去作,实在看不下去了,便深夜有了此篇;
后续MM图的爬取,计划所有放到这里,有质量高的网站,能够留言,有空爬下~html

妹子图网

不解释,以前有篇requests的文章,代码如出一辙,只须要处理下xpath便可服务器

import requests
from lxml import html
import os

dir = "meizitupic/"


def Get_Page_Number(num):
    url = 'http://www.mzitu.com/page'+ str(num)
    response = requests.get(url).content
    # 调用requests库,获取二进制的相应内容。
    # 注意,这里使用.text方法的话,下面的html解析会报错.这里涉及到.content和.text的区别了。简单说,若是是处理文字、连接等内容,建议使用.text,处理视频、音频、图片等二进制内容,建议使用.content。
    selector = html.fromstring(response)
    # 使用lxml.html模块构建选择器,主要功能是将二进制的服务器相应内容response转化为可读取的元素树(element tree)。lxml中就有etree模块,是构建元素树用的。若是是将html字符串转化为可读取的元素树,就建议使用lxml.html.fromstring,毕竟这几个名字应该能大体说明功能了吧。
    urls = []
    # 准备容器
    for i in selector.xpath("//div[@class='postlist']/ul[@id='pins']/li/a/@href"):
        # 利用xpath定位到全部的套图的详细地址
        urls.append(i)
    #     # 遍历全部地址,添加到容器中
    return urls


def Get_Image_Title(url):
    # 如今进入到套图的详情页面了,如今要把套图的标题和图片总数提取出来
    response = requests.get(url).content
    selector = html.fromstring(response)
    image_title = selector.xpath("//div[@class='content']/h2/text()")[0]
    # 须要注意的是,xpath返回的结果都是序列,因此须要使用[0]进行定位
    return image_title


def Get_Image_Count(url):

    response = requests.get(url).content
    selector = html.fromstring(response)
    image_count = selector.xpath("//div[@class='pagenavi']/a[last()-1]/text()")[0]
    return image_count


def Get_Image_Url(url):
    #获取图片的下载连接
    response = requests.get(url).content
    selector = html.fromstring(response)
    image_links = []
    image_aount = selector.xpath("//div[@class='pagenavi']/a[last()-1]/span/text()")[0]
    # 获取网页总数,直接读取下一页那排的倒数第二个参数,通常是页数的总数,拿这个总数去遍历

    for i in range(int(image_aount)):
        image_url = url + "/" + str(i + 1)
        response = requests.get(image_url).content
        sel = html.fromstring(response)
        image_download_link = sel.xpath("//div[@class='main-image']/p/a/img/@src")[0]
        # 这里是单张图片的最终下载地址
        image_links.append(str(image_download_link))
    return image_links


def Download_Image(image_title, image_links):
    num = 1
    amount = len(image_links)

    if not os.path.exists(dir):
        os.makedirs(dir)
    for i in image_links:
        if not os.path.exists(dir+image_title):
            os.makedirs(dir+image_title)
        print('正在下载图片:%s第%s/%s张,' % (image_title, num, amount))
        # 用于在cmd窗口上输出提示,感受能够增长一个容错函数,没想好怎么写
        filename = image_title+"/"+str(num)+".jpg"
        #建立文件名
        with open(dir+filename, 'wb') as f:
        #以二进制写入的模式在本地构建新文件
            header = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.32 Safari/537.36',
                'Referer':i}
            f.write(requests.get(i,headers=header).content)
        # urllib.request.urlretrieve(requests.get(i,headers=header), "%s%s%s.jpg" % (dir, image_title, num))
        #若是使用这种方式爬,网站会返回防盗连接,爬的图片都同样,所以须要爬的时候UA作下处理,而urlretrieve并无设置请求头的方式,所以不适用本案例
        num += 1



if __name__ == '__main__':
    page_number = input('请输入须要爬取的页码:')
    for link in Get_Page_Number(1):
        Download_Image(Get_Image_Title(link), Get_Image_Url(link))
复制代码

相关文章
相关标签/搜索