目的:爬取一個網站的所有圖片
調用庫:requests庫,BeautifulSoup庫
程序設計:
1.函數getHTML():用於獲取url的html文本
代碼如下
def getHTML(url):
try:
r=requests.get(url,headers={'user-agent':'Mozilla/5.0'})
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
print('Fail')
該函數的注意事項是記得利用try except 的處理異常操作的方法來返回一個r.text
2.函數geturl():用於獲得圖片格式的url,在此處調用BeautifulSoup庫
代碼如下
def geturl(html,ulist):
soup=BeautifulSoup(html,'html.parser')
alist=soup.find_all('img')
for i in range(len(alist)):
ulist.append(alist[i].attrs['src'])
print(ulist)
該段函數的注意事項是利用soup的find_all()方法來返回一個包含圖片鏈接的所有標簽列表,值得注意的是返回的這個列表的每個元素都是BF庫解析過的html文件,所以不需要再次調用BF函數解析,我自己調了好久才發現》》》,最后將列表每個標簽元素的attrs[’src‘]添加到ulist這個結果列表中
3.函數download(),再次利用requests庫的get方法,以及os庫來保存文件
代碼如下
def download(url):
root='D:/pics/'
path=root+url.split("/")[-1]
print(path)
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r=requests.get(url)
r.raise_for_status()
with open(path,'wb') as k:
k.write(r.content)
k.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("失敗")
該段函數的注意事項是1.在這段函數中對程序進行了兼容性優化,那就是調用了os庫來檢查該電腦有沒有root這個根目錄,如果沒有就利用os.mkdir()方法創建這個root目錄,再將圖片文件寫入
4.最后使用一個主函數main()來調用以上三個函數來達到目的的實現
代碼如下
def main():
ulist=[]
url=str(input('輸入網址'))
html=getHTML(url)
geturl(html,ulist)
for k in ulist:
download(k)
print('finish')
該段代碼的注意事項是注意到用一個for循環來調用download函數從而寫入所有圖片文件,在這里我遇到一點小麻煩,一開始我是直接將for循環加到download函數中,但是運行就會一直報錯,這里我還沒有想通第一次方法為什么不可行
這個程序對於部分網址無法進行有效的爬取,這個坑可以以后學了更深的爬蟲知識再來解決。