1. 程式人生 > >Reptile:requests + re 實現糗事百科糗圖欄目圖片下載

Reptile:requests + re 實現糗事百科糗圖欄目圖片下載

wow 如果 sta 頁碼 get apple alt 嘗試 url

2019/1/24 晚上路飛學城的爬蟲課程,圖片下載:

通過requests + re下載糗事百科商的圖片

re表達式理解的不是很清楚,只能模糊理解,.*?是匹配全部的數據,.表示任意單個字符不包括換行符,*表示前面一個字符重復任意次,?表示簽一個字符出現0次或者1次。

以下為代碼:

# 數據解析:
# 1.指定url
# 2.發起請求
# 3.獲取頁面數據
# 4.進行數據解析
# 5.數據持久化存儲

# 三種解析的方式:
# 1.正則表達式解析
# 2.bs4 解析
# 3.xpath 解析

# 需求:下載糗事百科糗圖頁面的的圖片,並存儲到本地,嘗試實現多頁數據下載

import requests

import re
import os

# 先在當前目錄下穿件一個保存圖片的文件
if not os.path.exists(‘./images‘):
os.mkdir(‘images‘)

# 指定要爬取的url和請求頭信息

# 實現多頁數據獲取
start_page = int(input(‘Enter a start page:>>>‘))
end_page = int(input("Enter a end page:>>>"))
for i in range(start_page,end_page+1,1):
url = ‘https://www.qiushibaike.com/pic/page/
‘ + str(i) # 最開始打開的url是沒有page的,只有點到第二頁及以後才會有page,剛開始沒有註意到就直接用初始的url加上頁碼範圍,

                                    # 發現下載的還是第一頁的數據,後面又去看了一下才搞定,一定得註意
    headers = {
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ‘
‘Chrome/65.0.3325.181 Safari/537.36‘

}

# 發起請求並獲取返回數據
reponse = requests.get(url=url, headers=headers)
page_text = reponse.text
print(url)
# 對獲取的頁面數據進行解析
# <div class="thumb">
#
# <a href="/article/121465405" target="_blank">
# <img src="//pic.qiushibaike.com/system/pictures/12146/121465405/medium/HFBFXVWV4LKZB5QK.jpg" alt="大冬天給我送吃的是外賣小哥">
# </a>
#
# </div> 這裏是糗事百科圖片的網頁存儲結構,圖片的url就是通過re從上面提取出來的
# 先判斷一下請求的狀態碼是不是200,如果不是就提醒一下

if reponse.status_code == 200:
img_list = re.findall(‘<div class="thumb">.*?<img src="(.*?)".*?>.*?</div>‘,page_text,re.S)
for img_url in img_list:
img_url = ‘https:‘ + img_url # 將獲取到的圖片URL加上https的協議頭,前面獲取的URL是不完整的
# 對完整的URL發起get請求
img_code = requests.get(url=img_url, headers=headers).content # 獲取二進制的圖片數據,而不是文本數據

# 對獲取的二進制數據進行存儲
#print(img_list.split(‘/‘)[-1])
imgName = img_url.split(‘/‘)[-1].strip()
#print(imgName)
imgPath = ‘images/‘ + imgName
with open(imgPath, ‘wb‘) as fp:
fp.write(img_code)
print("%s \033[31m寫入完成\033[m"%imgName)
else:
print(‘訪問異常,請重試‘)

Reptile:requests + re 實現糗事百科糗圖欄目圖片下載