爬蟲筆記(三)爬取‘糗事百科’熱圖板塊所有圖
阿新 • • 發佈:2021-01-03
目的:爬取‘糗事百科’熱圖板塊所有圖
在網頁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)