美女图片爬取

有统计说一个网站的流量百分之八十都是由爬虫带走的。我感觉这个比例还是小了,只有用过爬虫才会知道爬虫的厉害。下面我将会介绍一种使用爬虫来爬取图片网站中的图片的方法。

首先,我们需要定义一个专门的类,在类外通过传入网址来进行爬取。

class GrilPhoto:
    pass

下面,我们分析一下这个类所需要的功能,然后设计出大致的结构。

我们需要生成动态的url,所以需要定义一个函数来拼接完整的url。

    def make_url_list(self):
        """
        生成url列表
        :return: 拼接后的完整url
        """
        return [self.url_base.format(i) for i in range(1,10)]

我们需要定义一个函数返回目前访问的这个网站的源码内容。

 def download_url(self,url_base):
        """
        请求网站,返回网站的源码内容
        :param url_base: 网站url
        :return: 网站内容
        """
        time.sleep(0.05)
        request = requests.get(url_base,proxies=self.proxies,headers=self.headers)
        #使用'.text'返回的是字符串类型,使用'.content'返回的是字节流,此处使用字符串类型
        return request.text

网站内容已经有了,那么接下来就是进行规则匹配了。

 def parse_xpath(self,text):
        """
        匹配函数
        :param text:网站内容
        :return:匹配到的内容(列表形式)
        """
        html = lxml.html.fromstring(text)
        html_data = html.xpath('//body/div[2]/div[8]/ul/li/a/img/@src')
        print(html_data)
        return html_data

上步返回的就是每一张图片的完整路径,那么接下来我们只需要保存下载下来就可以了。

    def save_photo(self,html_data,num_page):
        """
        保存下载图片
        :param html_data:匹配到的内容
        :param num_page: 页码
        :return:
        """
        for i in range(len(html_data)):
            time.sleep(0.05)
            req = requests.get(html_data[i],proxies=self.proxies,headers=self.headers)
            with open('D:/美女图片/第'+str(num_page)+'页-0'+ str(i) +'.jpg','wb') as f:
                f.write(req.content)

注意:我这里指定的保存路径是在D盘下的一个叫美女图片的文件夹中,当然,你也可以指定其他的文件夹,前提是这个文件夹存在(不存在当然要自己创建喽)。

最后一步,定义运行函数

 def run(self):
        """
        运行函数
        :return:
        """
        list = self.make_url_list()
        for i in range(len(list)):
            text = self.download_url(list[i])
            data = self.parse_xpath(text)
            self.save_photo(data,i+1)

最后,附上整个程序的源码,在这个代码中我爬取的是美女图片,你也是可以指定其他网站的,不过,需要修改匹配规则,有兴趣的可以尝试尝试其他的网站。

import requests
import lxml.html
import time

class GirlPhoto:
    def __init__(self):
        """
        初始化对象
        """
        #代理IP
        self.proxies = {"http":"http://39.137.69.6:80"}
        #请求头
        self.headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
        }
        #爬取网址(待拼接)
        self.url_base = 'http://www.umei.cc/meinvtupian/{}.htm'
    def download_url(self,url_base):
        """
        请求网站,返回网站的源码内容
        :param url_base: 网站url
        :return: 网站内容
        """
        time.sleep(0.05)
        request = requests.get(url_base,proxies=self.proxies,headers=self.headers)
        #使用'.text'返回的是字符串类型,使用'.content'返回的是字节流,此处使用字符串类型
        return request.text

    def make_url_list(self):
        """
        生成url列表
        :return: 拼接后的完整url
        """
        return [self.url_base.format(i) for i in range(1,10)]

    def parse_xpath(self,text):
        """
        匹配函数
        :param text:网站内容
        :return:匹配到的内容(列表形式)
        """
        html = lxml.html.fromstring(text)
        html_data = html.xpath('//body/div[2]/div[8]/ul/li/a/img/@src')
        print(html_data)
        return html_data
    def save_photo(self,html_data,num_page):
        """
        保存下载图片
        :param html_data:匹配到的内容
        :param num_page: 页码
        :return:
        """
        for i in range(len(html_data)):
            time.sleep(0.05)
            req = requests.get(html_data[i],proxies=self.proxies,headers=self.headers)
            with open('D:/美女图片/第'+str(num_page)+'页-0'+ str(i) +'.jpg','wb') as f:
                f.write(req.content)

    def run(self):
        """
        运行函数
        :return:
        """
        list = self.make_url_list()
        for i in range(len(list)):
            text = self.download_url(list[i])
            data = self.parse_xpath(text)
            self.save_photo(data,i+1)

girl = GirlPhoto()
girl.run()


猜你喜欢

转载自blog.csdn.net/j123__/article/details/82532914