爬蟲實踐---電影排行榜和圖片批量下載
阿新 • • 發佈:2017-07-27
.com sts mat 模式 filename ise 主演 any cto
1.目標網址:http://dianying.2345.com/top/
需要找到的信息:電影的名字,主演,簡介,和標題圖片
2.查看頁面結構:
容易看到,需要的主題部分,都被包裹在‘<ul>“列表標簽裏,
那麽簡單的用bs4庫找到 "<ul>" tag並叠代取出每一條“<li>”tag,
最後再從每個<li>標簽裏找到需要的信息即可。
3.圖片下載:
在電影排行榜爬蟲當中,有一項目標是:爬取每個電影的標題圖,
那麽如何以文本的形式爬下來呢?
在計算機的世界裏,一切的數據歸根到底都是以“0”和“1”的二進制形式存在的。
圖片自然也不例外,任何一張圖片,都是以“字節流 ”的形式,
通過了一定的編碼方式,被計算機排列組合,從而顯示成我們肉眼所看到的圖片。
那麽只要把圖片數據從網上下載下來,然後再以二進制的格式寫入到本地即可。
給出一個圖片下載的通用代碼片段:
import requests def get_pic_from_url(url): #從url以二進制的格式下載圖片數據 pic_content = requests.get(url,stream=True).content open(‘filename‘,‘wb‘).write(pic_content)
4.完整代碼
import requests from bs4 import BeautifulSoup def get_html(url): try: r = requests.get(url,timeout = 30) r.raise_for_status r.encoding = ‘gb2312‘ return r.text except: return ‘error‘ def get_content(url): html= get_html(url) soup = BeautifulSoup(html,‘lxml‘) # 找到電影排行榜的ul列表 movie_list = soup.find(‘ul‘,class_=‘picList clearfix‘) movies = movie_list.find_all(‘li‘) for movie in movies: # 找到圖片鏈接,電影名稱 img_url = movie.find(‘img‘)[‘src‘] name = movie.find(‘span‘,class_=‘sTit‘).text #這裏做一個異常捕獲,防止沒有上映時間 try: time = movie.find(‘span‘,class_=‘sIntro‘).text except: time = ‘暫無上映時間‘ # 叠代找出“pACtor”的所有子孫節點,解決每一位演員的名字分割問題 try: actors = movie.find(‘p‘,class_=‘pActor‘).contents actor = ‘‘ for act in actors: actor = actor + act.string + ‘ ‘ except: actor = ‘暫無主演‘ # 找到影片簡介 intro = movie.find(‘p‘,class_=‘pTxt pIntroShow‘).text print("片名:{}\t{}\n{}\n{} \n \n".format(name,time,actor,intro)) # 把圖片下載下來,以二進制讀寫模式打開 with open(‘C:/Users/Administrator/Desktop/img/‘+name+‘.png‘,‘wb+‘) as f: f.write(requests.get(img_url).content) def main(): url = ‘http://dianying.2345.com/top/‘ get_content(url) if __name__ == ‘__main__‘: main()
5.輸出結果
6.註意點
requests的content和text屬性的區別:
從print 結果來看是沒有任何區別的
resp.text返回的是Unicode型的數據。
resp.content返回的是bytes型也就是二進制的數據。
也就是說,如果想獲取文本,可以通過r.text。
如果想取圖片,文件,則可以通過r.content。
爬蟲實踐---電影排行榜和圖片批量下載