爬取網頁(涉及儲存和作圖)
阿新 • • 發佈:2022-05-07
(1)爬取網頁 http://www.pythonscraping.com/pages/page3.html。
(2)從上述網頁中獲取禮品的 item title、description、cost 和 image,並儲存在本地。
(3)編寫一個函式 get( item_title ),從儲存在本地的資料中獲取給定 item title 的 禮 品的
description、cost 和 image(圖形檔名)
(4)編寫一個函式 drawGift(item_title ),繪出給定 item title 的禮品的圖片,並在圖中給出禮品的 title、
description 和 cost
1 import matplotlib.pyplot as plt 2 import re 3 import requests 4 from requests import RequestException 5 import json 6 7 def get_one_page(url): #獲取網頁 8 try: 9 response=requests.get(url) 10 if response.status_code==200: 11 return response.text 12 returnNone 13 except RequestException: 14 return None 15 16 def parse_html(html): #獲取需要的部分 17 pattern=re.compile('<tr.*?<td>(.*?)</td>.*?<td>(.*?)<span.*?</td>.*?<td>(.*?)</td>.*?<td>.*?<img src="(.*?)">.*?</td></tr>',re.S) 18 gifts=re.findall(pattern,html)19 print(gifts) 20 for gift in gifts: 21 yield { #生成器 22 'itemTitle':gift[0].strip('\n'), 23 'description':gift[1].strip('\n'), 24 'cost':gift[2].strip('\n'), 25 'image':gift[3] 26 } 27 28 def write_to_file(content): #寫入檔案 29 with open('result.txt','a',encoding='utf-8') as f: #a表示追加 30 f.write(json.dumps(content,ensure_ascii=False)+'\n') 31 32 def download_img(): #下載圖片 33 with open('result.txt','r') as f: 34 lines=f.readlines() 35 for line in lines: 36 url='http://www.pythonscraping.com'+json.loads(line).get("image")[2:] 37 r=requests.get(url) 38 with open(url[-8:],'wb') as f1: 39 f1.write(r.content) 40 41 def get(item_title): #獲取指定圖片的相關資訊 42 with open('result.txt','r') as f: 43 lines=f.readlines() 44 for line in lines: 45 if json.loads(line).get("itemTitle")==item_title: 46 return json.loads(line) 47 48 def drawGift(item_title): #作圖 49 r=get(item_title) 50 img=plt.imread(r.get("image")[-8:]) 51 plt.imshow(img) 52 plt.axis('off') 53 plt.title(r.get("itemTitle")+'\n'+r.get("description")+''+r.get("cost")) 54 plt.show() 55 56 def main(): 57 url='http://www.pythonscraping.com/pages/page3.html' 58 html=get_one_page(url) 59 for gift in parse_html(html): 60 write_to_file(gift) 61 download_img() 62 63 if __name__ == '__main__': 64 item_title="Dead Parrot" 65 main() 66 drawGift(item_title)