一、什么是爬蟲
什么是爬蟲?爬蟲是蜘蛛么?是八爪魚么?nonono。
爬蟲是指請求網站並獲取數據的自動化程序,又稱網頁蜘蛛或網絡機器,最常用領域是搜索引擎,最常用的工具是八爪魚。
它的基本流程分為以下五部分,依次是:
明確需求——發送請求——獲取數據——解析數據——存儲數據。
爬蟲的三大特點:
- 網頁都有唯一的URL(統一資源定位符,也就是網址)進行定位
- 網頁都使用HTML(定位超文本標記語言)來描述頁面信息
- 網頁都使用HTTP/HTTPS(超文本傳輸協議)協議來傳輸HTML數據
爬蟲可以由什么編寫呢:
編寫爬蟲的語言有很多,但用的最多最廣的還應該是Python,並且也誕生了很多優秀的庫和框架,如scrapy、BeautifulSoup 、pyquery、Mechanize等。但是一般來說,搜索引擎的爬蟲對爬蟲的效率要求更高,會選用c++、java、go(適合高並發)。
二、爬蟲前期准備工作
1、准備一台性能良好的電腦
電腦要求:windows7以上,內存四核8G以上
2、安裝python環境
python官網下載地址:
https://www.python.org/downloads/release/python-395/
安裝流程:
請自行百度。
3、安裝所需要的擴展
咱們主要使用以下四個擴展:
import os # python自帶擴展不需要安裝 import requests # pip install requests from urllib import request # python自帶擴展不需要安裝 from bs4 import BeautifulSoup # 安裝命令:pip install bs4
4、查找一個可讀取源碼的圖片網站
注意注意:此鏈接僅供學習參考,請勿非法批量爬取,任何不聽勸阻,一意孤行者,如若產生違法亂紀之事,請自行承擔。(開發不易,且行且珍惜)
抓取圖片的地址:https://www.umei.cc/meinvtupian/meinvxiezhen/
三、分析網站源碼
1、分析源碼,得到獲取源碼的三個方向(編碼格式、請求方式、header請求頭)
- windows默認是gbk的編碼格式,網頁一般默認是utf-8的編碼,所以直接用windows電腦抓取網頁內容信息的時候可能會遇到亂碼的問題,所以請求的時候統一編碼格式保證數據不亂嗎
- 請求方式有post、get、put等方式校驗,所以選擇對的請求方式獲取頁面信息,如果不爭取可能會出現404找不到頁面或者500服務器錯誤
- header請求頭包含很多陰性信息,如果我們常見的,如:反爬機制、token校驗、cookie校驗等等
2、查找列表頁的唯一節點
3、根據圖片排版,查找源碼規律(相同的li標簽獲取節點)
4、獲取列表的最后一頁,獲取最后一頁的頁碼(NewPages節點下的尾頁,代表最后141頁)
根據圖片分頁的頁碼地址規律,我們能得到(特別注意:第一頁不能使用 index_1.htm 來查詢):
https://www.umei.net/meinvtupian/meinvxiezhen/ 第一頁沒有index
https://www.umei.net/meinvtupian/meinvxiezhen/index_2.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_3.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_4.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_5.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_6.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_7.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_8.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_9.htm
......
5、根據每一個圖片鏈接,進入圖片詳情
根據上題3可以看出,圖片詳情的地址為: https://www.umei.net/meinvtupian/meinvxiezhen/233941.htm
6、查找圖片詳情的地址規律,獲取所有的詳情子圖片地址
根據圖片詳情可以查看出來每一個子圖片的詳情地址: https://www.umei.net/meinvtupian/meinvxiezhen/233941.htm https://www.umei.net/meinvtupian/meinvxiezhen/233941_2.htm https://www.umei.net/meinvtupian/meinvxiezhen/233941_3.htm https://www.umei.net/meinvtupian/meinvxiezhen/233941_4.htm https://www.umei.net/meinvtupian/meinvxiezhen/233941_5.htm https://www.umei.net/meinvtupian/meinvxiezhen/233941_6.htm https://www.umei.net/meinvtupian/meinvxiezhen/233941_7.htm https://www.umei.net/meinvtupian/meinvxiezhen/233941_8.htm https://www.umei.net/meinvtupian/meinvxiezhen/233941_9.htm
7、根據地址抓取圖片流,保留本地
根據題6獲取的圖片地址進行爬取圖片信息,保存到本地,頁面分析到此結束,廢話不多說,直接上代碼,趕緊抓取。
四、開始編寫我們的爬蟲腳本
1、封裝式代碼
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/06/06 14:48 # @Author : Liu # @Site : # @File : 美圖小姐姐.py # @Software: PyCharm import requests import time import os import re from urllib import request from bs4 import BeautifulSoup url_address = "https://www.umei.cc" def get_url_path(url): """ 獲取地址內容信息 :param url: :return: """ # time.sleep(1) # 獲取源碼的時候睡眠一秒 obj = requests.get(url) obj.encoding = obj.apparent_encoding return obj.text def get_page_info(): """ 抓取每頁信息 :return: """ nums = int(input("輸入抓取的頁數:")) for i in range(nums): if i < 1: url = f"{ url_address }/meinvtupian/meinvxiezhen/" else: url = f"{ url_address }/meinvtupian/meinvxiezhen/index_{i + 1}.htm" ret = get_url_path(url) # 獲取頁面信息 get_bs4(ret) # 逐頁抓取頁面信息 print(f"第{i+1}頁完成") pass def get_bs4(ret): soup = BeautifulSoup(ret, "html.parser") li_list = soup.select(".TypeList")[0].find_all(name="li") for i in li_list: # 先獲取第一張圖片 img_src = url_address + i.a["href"] ret1 = get_url_path(img_src) # 獲取頁面信息 get_image_info(ret1, i.a.span.string, 1) # print(ret1) # 獲取分頁后的頁面圖片數量 # script_reg = r'<script type="text\/javascript">Next\("\d+","(?P<num>\d+)",.*?\)<\/script>' script_reg = r'<a href="/meinvtupian/meinvxiezhen/(?P<num>[0-9_]+).htm">尾頁</a>' num_str = re.search(script_reg, ret1, re.S).group("num") page_num = int(num_str.split("_")[1]) # 獲取圖片數量 img_lst = os.path.basename(i.a["href"]).split(".") # 獲取圖片的后綴 img_dir = os.path.dirname(i.a["href"]) # 獲取圖片的地址路徑 for j in range(2, page_num+1): img_src = f"{ url_address }{img_dir}/{img_lst[0]}_{j}.{img_lst[1]}" res = get_url_path(img_src) # 獲取頁面信息 get_image_info(res, i.a.span.string, j) def get_image_info(ret, name, i): soup = BeautifulSoup(ret, "html.parser") img = soup.select(".ImageBody img")[0] image_path = img["src"] # 獲取圖片地址 image_name = name # 獲取圖片中文所屬 img_name = f"{image_name}_{i}.{os.path.basename(image_path).split('.')[1]}" # 獲取圖片真實名字 # 圖片存儲 image_dir = f"girl/{image_name}" if not os.path.isdir(image_dir): os.makedirs(image_dir) # 遠程打開圖片寫入到本地 第一種方式open # with open(f"{image_dir}/{img_name}", mode="wb") as add: # add.write(requests.get(image_path).content) # 遠程打開圖片寫入到本地 第二種方式urllib request.urlretrieve(image_path, filename=f"{image_dir}/{img_name}") print("已經開始執行了,可能需要等待一會,請您耐心等待!") begin_time = int(time.time()) get_page_info() end_time = int(time.time()) print(f"當前腳本執行了{end_time - begin_time}秒") print("執行已經結束了")
2、簡單的爬取首頁展示圖片代碼
import os import requests from bs4 import BeautifulSoup from urllib import request url_address = 'https://www.umei.cc' list_url = url_address + '/meinvtupian/meinvxiezhen/' obj = requests.get(list_url) obj.encoding = obj.apparent_encoding content = obj.text
# 格式化頁面 soup = BeautifulSoup(content, 'html.parser') li_soup = soup.select(".TypeList")[0].findAll("li") dir = "./girls/" for i in li_soup: if not os.path.isdir(dir): os.makedirs(dir) img_path = i.img["src"] img_suffix = os.path.basename(img_path).split('.')[1] img_url = dir + i.span.string + '.' + img_suffix request.urlretrieve(img_path, img_url)