1. 程式人生 > >編了一套爬蟲美女圖的一組程式碼,請大神指點一二;

編了一套爬蟲美女圖的一組程式碼,請大神指點一二;

# -*- coding: utf-8 -*-
#coding=utf-8
#_author_='Lucky';
#date: 2018/12/19
import os
import re
import requests
from lxml import etree
from bs4 import BeautifulSoup

def get_main():#定義最外層的函式

for result in range(200):#因為目錄有175頁,所以定義這個區間
if result ==0:
url = f"http://www.mm131.com/xinggan"
else:
url = f"http://www.mm131.com/xinggan/list_6_{result}.html"#發現規律地址都是後面加_數字
res = requests.get(url)#請求上面網址返回給變數res
print(res)
res.encoding = res.apparent_encoding # 將變數進行編碼轉換 沒有實際意義
soup = BeautifulSoup(res.text, "lxml") # 解析後的內容給soup物件
tr_soup = soup.find_all("dd")#發現目錄主圖都是在dd標籤下面
# print(tr_soup)
get_url(tr_soup,result)#呼叫下面的函式 傳的引數是上面篩選出來的 dd標籤中的內容

def get_url(defaul,res):#目錄中的二層url地址生成
for i in defaul:
if i.find("a"):#查詢a標籤下的所有內容
text = i.get_text()#如果找到就提取文字到前面變數
print(text)
link = i.find("a").get("href")#將標籤a下面href的值url單獨給變數link列表
print(link)
if 'html' in link:#尤其注意這裡,為了防止爬到的地址不存在html字串,(也就是說爬的地址不是圖片url地址)加次條件
link_re = '/.+?\.' # 先定義個正則表示式,為了後面做url拼接使用,實際是找出這個表示式的值
end_link = re.compile(link_re) # 編譯上面的表示式後才能被python識別
end_url = re.findall(end_link, link) # 找出link中符合正則表達的內容
print('end_url=', end_url)
new = end_url[1].strip('.') # end_url[1]的值中有個.在拼接url時無法拼接,故用strip刪除

for num in range(2, 55): # 每個目錄下基本上都是存在55個子圖片,故用區間
end2_link = new + '_%d' % num # 字串拼接
web = ('http://www.mm131.com' + end2_link + '.html') # 形成要訪問的url
print(web)
get_endurl(web, num, text)

def get_endurl(web, no, text):#末端請求Url和圖片儲存寫入
headers = {
'Referer': f'{web}',
'User-Agent': 'Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}#請求頭

res = requests.get(web)#訪問對應Url,返回資訊到res
result = etree.HTML(res.content)#通過etree.HTML的函式講res進行解析,這樣才能通過xpath來找到圖片
# print(etree.tostring(result).decode("utf-8"))
img_list = result.xpath("//div[@class='content-pic']/a/img/@src")#將所有@src圖片地址放到列表中
print(img_list)
for img in img_list:#遍歷上面的列表
rimage = requests.get(img, headers=headers)#將每次遍歷到的圖片src,返回給rimage
with open(f'img2/{text}_{no}.jpg', 'wb') as f:#開啟Img資料夾儲存定義的檔名,
f.write(rimage.content)

if __name__ == '__main__':
get_main()