python实战项目一:requests爬取淘宝图片
按關鍵詞爬取淘寶的圖片
●實驗過程遇到的問題:
1.??????一開始我沒注意,將文件名寫為requests.py,但是運行時卻出現(xiàn)了這個錯誤:module 'requests' has no attribute 'get',代碼檢查了好幾次,才想起來,python調用模塊會優(yōu)先從當前路徑下搜索該模塊,找不到再去環(huán)境變量里找,這個如果用requests命名,那問題就是,程序一運行,當前目錄下就有一個requests.py,那么它就會引用該模塊,自然會報錯,修改文件名之后運行成功
2.??????之前一直不怎么懂requests庫如何將爬取到的圖片下載下來,今天自己體驗了一下爬取,才明白,直接附代碼吧
with open('D:/pictures/'+str(i)+str(n)+'.jpg', 'wb') as f:f.write(pic.content)需要注意的是,下載圖片打開文件方式為’wb’,即以二進制方式寫入。圖片、音頻、視頻這些文件本質都是由二進制碼組成的,要想抓取這些,就要拿到它們的二進制碼。寫入文本可用.text,寫入圖片音頻視頻要用.content。
使用正則表達式時,re.compile(pat, re.S).findall(html)或是re.findall(pat,re.S, html),如果要提取的內容在多行,由于.*?不能匹配多行,所以增加re.S這句,可以匹配多行
3.??????爬淘寶要模擬瀏覽器訪問,否則會被禁止爬取的,方法是可以加一個頭信息爬取
?
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}r = requests.get(url, headers=headers)?
4.??????如果我沒記錯的話,好像用urllib庫爬取時,若是想要用關鍵詞爬取,而關鍵詞又是含有中文的話,則要增加一步將中文為url可讀取的方式這一步驟,requests庫就不需要,
?
5.??????關于if __name__ == '__main__',意思是:當.py文件被直接運行時,if__name__ == '__main__'之下的代碼塊將被運行,若.py文件以模塊形式被導入時,if __name__ == '__main__'之下的代碼塊不被運行。
●最后代碼可以實現(xiàn)的功能:一開始只是想爬取淘女郎圖片的,后來優(yōu)化時,就想功能多一點也好,就利用關鍵詞去爬取。所以現(xiàn)在可以任意輸入一個關鍵詞,都可以爬取了。
附上代碼,主要是給自己做一個筆記,擔心在本地的話可能會不小心被自己給刪掉
import re import requests import time import osdef get_one_html(url): # 獲取一個頁面的html頁面并返回try:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}r = requests.get(url, headers=headers)if r.status_code == 200:r.encoding = r.apparent_encodingreturn r.textexcept Exception as er:print(er)def get_pic_url(html): # 用正則提取每一頁的關鍵信息返回pic_urls = re.findall('"pic_url":"(.*?)"', html, re.S)img_url = [] # 創(chuàng)建空列表,裝每一頁的所有圖片的鏈接for one_pic_url in pic_urls:img_url.append('http:'+one_pic_url)return img_url # 返回圖片的鏈接的列表def write_to_file(page, img_urls): # 寫入文件(下載)i = page # 利用頁碼,防止后面的寫入會覆蓋之前的n = 0for pic_url in img_urls:pic = requests.get(pic_url)with open('D:/pictures/'+str(i)+str(n)+'.jpg', 'wb') as f:f.write(pic.content)print('---第{}頁第{}張圖下載成功---'.format(str(i), str(n)))n += 1def main(keyword, page_num, url):html = get_one_html(url) # 調用函數(shù)得到該頁的hmlimg_urls = get_pic_url(html) # 調用函數(shù)得到該頁的所有圖片的鏈接write_to_file(page, img_urls) # 調用函數(shù),寫入即下載圖片if __name__ == '__main__':keyword = input('請輸入關鍵詞:')page_num = eval(input('請輸入要爬取的頁數(shù):'))try:os.mkdir('D:/pictures/')for page in range(0, page_num):url = 'http://s.taobao.com/search?q='+keyword+'&s='+str(page)main(keyword, page_num, url)if page % 2 == 0:time.sleep(10) # 每爬取2頁停留10秒except Exception as err:print(err)?
?
?
總結
以上是生活随笔為你收集整理的python实战项目一:requests爬取淘宝图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fvwm新手入门不完全手册(原创)
- 下一篇: 42 个 Visual Studio 代