1. 程式人生 > >Python爬蟲——利用requests模組爬取妹子圖

Python爬蟲——利用requests模組爬取妹子圖

近期學了下python爬蟲,利用requests模組爬取了妹子圖上的圖片,給單身狗們發波福利,哈哈!順便記錄一下第一次發部落格。

話不多說,進入正題

  • 開發環境
    • python 3.6
  • 涉及到的庫
    • requests
    • lxml

先上一波爬取的截圖

樣本
資料夾

網站首頁

每一頁有很多個系列,每個系列有10張圖左右,爬蟲程式以圖片寫的文字為目錄,儲存每張圖片

首頁

圖片爬取

  1. 獲取每個分類下每張圖片的連結地址
    xpath表示式是爬蟲常用的一個工具,通過request模組獲取的內容需要利用lxml模組下的etree方法才可以通過xpath表示式提取內容
    圖片的連結提取表示式為:
li_list = html.xpath("//ul[contains(@class, 'wp-list')]/li")
img_url = li.xpath(".//a/@href")[0] if len(li.xpath(".//a/@href"))>0 else None
  1. 提取圖片內容並儲存
    得到每張圖片的連結地址以後,通過requests模組獲取圖片內容並儲存
        for i in range(len(img_list)):
            file_path = "./imgs/"+img_tag+"/"+str(i)+".jpg"
            print(file_path)
            print("開始儲存圖片{}\n"
.format(i), img_list[i]) with open(file_path, "wb") as f: f.write(requests.get(img_list[i],headers=self.headers, timeout=10).content) print("儲存成功!")

由於每一頁的圖片比較多,提取一頁已經足夠,通過引數page_num可以設定要爬去的頁數

圖片為二進位制檔案,儲存圖片的方法為:

        for i in range(len(img_list)):
            file_path = "./imgs/"
+img_tag+"/"+str(i)+".jpg" print(file_path) print("開始儲存圖片{}\n".format(i), img_list[i]) with open(file_path, "wb") as f: f.write(requests.get(img_list[i],headers=self.headers, timeout=10).content) print("儲存成功!")

程式執行的效果

這裡寫圖片描述

最後附上原始碼

# -*- coding: utf-8 -*-

"""
--------------------------------------------------------
# @Version : python3.6
# @Author  : wangTongGen
# @File    : meizi_spider.py
# @Software: PyCharm
# @Time    : 2018/8/19 18:32
--------------------------------------------------------
# @Description:this is programed to spider mei_zi_tu
--------------------------------------------------------
"""
import os
import requests
from lxml import etree


class MeiZiSpider(object):

    # 初始化函式
    def __init__(self, page_num):
        self.page_num = page_num #定義要爬取的網頁數
        self.start_url = "http://www.meizitu.com/a/more_{}.html" #爬蟲的起始地址
        #新增請求頭,模擬瀏覽器訪問
        self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"}
        if not os.path.exists('./imgs'):
            os.mkdir('./imgs')

    # 獲取爬蟲網頁列表
    def get_url_list(self):
        return [self.start_url.format(i+1) for i in range(self.page_num)]

    # 獲取response並轉化為xpath表示式可以解析的格式
    def parse_url(self, url):
        html_str = requests.get(url, headers=self.headers).content.decode("gbk")
        html = etree.HTML(html_str)
        return html

    # 獲得每個分類下每張圖片的url
    def get_img_url_list(self, html):
        li_list = html.xpath("//ul[contains(@class, 'wp-list')]/li")
        for li in li_list:
            img_tag = li.xpath(".//b/text()")[0] if len(li.xpath(".//b/text()"))>0 else None
            if img_tag is None:
                img_tag = li.xpath(".//a/text()")[0]
            detail_url = li.xpath(".//a/@href")[0] if len(li.xpath(".//a/@href"))>0 else None
            if detail_url is not None:
                print(img_tag)
                if not os.path.exists("./imgs/" + img_tag):
                    os.mkdir("./imgs/" + img_tag)
                self.parse_detail(detail_url, img_tag)

    # 利用每張圖片的url獲得圖片並儲存到本地
    def parse_detail(self, detail_url, img_tag):
        html = self.parse_url(detail_url)
        img_list = html.xpath("//div[@id='picture']/p/img/@src")

        for i in range(len(img_list)):
            file_path = "./imgs/"+img_tag+"/"+str(i)+".jpg"
            print("開始儲存圖片{}\n".format(i), img_list[i])
            with open(file_path, "wb") as f:
                f.write(requests.get(img_list[i],headers=self.headers, timeout=10).content)
            print("儲存成功!")

    # 爬蟲主函式
    def run_spider(self):
        # 獲取url列表
        url_list = self.get_url_list()
        # 逐次爬取
        for url in url_list:
            html_str = self.parse_url(url)
            self.get_img_url_list(html_str)



if __name__ == '__main__':

    # 定義要爬取的頁面數(1--71)
    page_num = 1
    # 構造一個爬蟲物件
    mei_zi = MeiZiSpider(page_num)
    # 執行爬蟲
    mei_zi.run_spider()