Python爬蟲——利用requests模組爬取妹子圖
阿新 • • 發佈:2019-01-30
近期學了下python爬蟲,利用requests模組爬取了妹子圖上的圖片,給單身狗們發波福利,哈哈!順便記錄一下第一次發部落格。
話不多說,進入正題
- 開發環境
- python 3.6
- 涉及到的庫
- requests
- lxml
先上一波爬取的截圖
網站首頁
每一頁有很多個系列,每個系列有10張圖左右,爬蟲程式以圖片寫的文字為目錄,儲存每張圖片
圖片爬取
- 獲取每個分類下每張圖片的連結地址
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
- 提取圖片內容並儲存
得到每張圖片的連結地址以後,通過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()