第三節:爬取美女圖片
爬取要求:
1. 爬取http://weheartit.com/inspirations/taylorswift網站的所有美女圖片
2.下載圖片到本地文件夾內
重點在于:
1. 異步加載地址鏈接的獲取。
鏈接地址在:瀏覽器 --> F12 --> NetWork --> XHR
向下滑動網頁,使其產生異步通信,獲得異步通信中的真實url地址
before參數沒用,可以刪除。
image.png
2. 圖片的下載:
圖片下載之前,要檢查是否已經下載過了,避免重復的下載
img_list = os.listdir('imgs') if img_name in img_list: print '文件已經下載 {}'.format(url)
代碼如下:
#coding=utf-8
import os
import time
import urllib
import requests
from bs4 import BeautifulSoup
def get_img_links(url):
"""獲取當前頁的所需的所有圖片鏈接url
返回一個list"""
time.sleep(1) #延遲1秒
headers = {
'User-Agent': ('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
'Chrome/54.0.2840.87 Safari/537.36')
}
html = requests.get(url,headers=headers).text
soup = BeautifulSoup(html,'lxml')
imgs = soup.select('img.entry-thumbnail')
img_links = [img.get('src') for img in imgs]
print '當前頁圖片鏈接個數 {}'.format(len(img_links))
return img_links
def down_img(urls,file_name):
"""下載圖片,保存到指定文件夾內 以圖片id為文件名
http://data.whicdn.com/images/115947809/superthumb.jpg
圖片id為 115947809 """
if not os.path.exists(file_name): #如果文件夾不存在,則建立一個新的文件夾
print '文件夾不存在,重新建立 {} 文件夾'.format(file_name)
os.mkdir(file_name) #使用os.mkdir建立文件夾,如果需要建立嵌套文件夾 如:/a/b 則需要使用 os.makedirs()
for url in urls:
img_suffix = os.path.splitext(url)[1] #圖片文件后綴 .jpg
img_name = url.split('/')[4] + img_suffix
img_path = os.path.join(file_name,img_name)
# 下載文件并保存到文件夾內
# 如果文件已存在文件夾呢,則跳過,避免重復下載
img_list = os.listdir('imgs')
if img_name in img_list:
print '文件已經下載 {}'.format(url)
else:
#urlretrieve(url,filename) 傳入文件url,文件路徑(包括文件名例如/imges/134.jpg),下載文件到本地
urllib.urlretrieve(url, img_path)
print '下載圖片 -- {} ,保存路徑 -- {}'.format(url, img_path)
def main():
"""主函數,啟動爬蟲"""
#拼接前20頁的page_url
page_url = 'http://weheartit.com/inspirations/taylorswift?scrolling=true&page={}'
page_url_list = [page_url.format(index) for index in range(1,21)]
print '總共 {} 頁'.format(len(page_url_list))
#獲取每一頁中的美女圖片,并保存到文件夾imgs內
img_urls = []
for url in page_url_list:
img_urls.extend(get_img_links(url))
print '總共 {} 張圖片'.format(len(img_urls))
down_img(img_urls, 'imgs')
print '總共下載 {} 張圖片'.format(len(os.listdir('imgs')))
if __name__ == '__main__':
main()