1. 程式人生 > 實用技巧 >爬蟲筆記(三)爬取‘糗事百科’熱圖板塊所有圖

爬蟲筆記(三)爬取‘糗事百科’熱圖板塊所有圖

目的:爬取‘糗事百科’熱圖板塊所有圖

在網頁response中可以發現,每個圖是一個沒有http開頭的、以.jpg結尾的連結,在這個連結前邊補上http可以成功訪問該圖片。

所以第一步應該把需要下載的圖片的url下載下來,然後補上http,再下載,儲存到本地就可以。

下邊程式碼是第一步。

def download_picture_url(pageup,pagedonw):  #下載每個圖片的url(url前邊沒有http)
    picture_url = []
    for page in range(pageup,pagedonw):
        #https://www.qiushibaike.com/imgrank/page/2/
url = 'https://www.qiushibaike.com/imgrank/page/' #補充連線 url = url + str(page) + '/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36' } page_test = requests.get(url=url, headers=headers).text
# print(page_test) data_list = re.findall(r'<div class="thumb">.*?</div>', page_test, re.S) for div in data_list: picture_url.append(re.search(r'(<img src="//)(.*?)(" alt=)', div, re.S).group(2)) for i in picture_url: if i[-3:] != 'jpg': picture_url.remove(i)
return picture_url
    for page in range(pageup,pagedonw):
        #https://www.qiushibaike.com/imgrank/page/2/
        url = 'https://www.qiushibaike.com/imgrank/page/'  #補充連線
        url = url + str(page) + '/'

上邊程式碼中是為了實現翻頁,每一頁的url最後page不一樣,所以這樣寫。

其中response是一個text格式,裡邊有很多的無用資訊,需要從text中提取圖片的url。

這裡需要說一點,檢視瀏覽器的response不能只看xhr裡的,xhr裡是動態的,應該檢視all裡的,

這個才是網頁的返回資訊,其他的請求都是請求的這個網頁後續再請求的內容。也就是在pycharm中requests的返回時這個'imrank/'裡的內容。

程式碼中還涉及到一個re模組的正則匹配,為的是挑出裡邊圖片的url。程式碼中做了兩次正則,第一次有開始和結束標記

第二次才是真正的url

第二步:每一個url前邊新增http

def add_http(list_url):   #給每一個圖片的url新增http
    list_url_new = []
    for i_url in list_url:
        i_url = 'https://'+i_url
        list_url_new.append(i_url)
    return list_url_new

第三部:下載圖片到本地

def download(list):  #下載每一個圖片
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    }
    if not os.path.exists('./qiushilib'):  #建路徑立一個資料夾,如果不想在當前目錄下建,可以用makedirs建,引數寫絕對
        os.makedirs('./qiushilib')
    num = 1
    for i in list:
        picture_content = requests.get(url=i, headers=headers).content
        #path = './qiushilib' + '/' + i.split('/')[-1]
        path = './qiushilib' + '/' + ''+str(num)+''+i.split('/')[-1]
        with open(path, 'wb') as p:
            p.write(picture_content)
            print(i.split('/')[-1], '下載成功',num)
        num = num + 1

在前幾次下載中,發現不論怕多少頁,結果都是25張圖。經過研究發現,第一頁中每一張圖和和第二頁中每一張圖.jpg前邊的編號是一樣的,所以造成如果用編號做圖片名稱的話,導致只能下載第一頁的,第二頁相當於就有這個檔名了,就不下載了。

整個過程沒有解決的問題:由於家裡網路不穩定,導致經常下載失敗,目前還不會下載失敗重新下載,或多試幾次這個功能,日後也是需要學習的。

最後主函式:

if __name__ == '__main__':
    picture_url = download_picture_url(1, 3)
    list_url_new = add_http(picture_url)
    download(list_url_new)