Python爬取京東商城商品大圖詳解
做為一個爬蟲初學者,在做爬取網址圖片的練習中以京東網為例爬取商品大圖并保存在相應的檔案夾
1.匯入模塊
import urllib.request
import re
2.商品名稱填寫區域
這里“AJ”只是舉個例子,當然也可以輸入其他任意商品
keyname="AJ"#輸入商品名稱
key=urllib.request.quote(keyname)
3.添加報頭
添加報頭的目的是模擬瀏覽器去訪問目標網頁,這里我用的是火狐瀏覽器,當然谷歌也可以,但是需要改一下報頭資訊
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
4.分析商品網頁
在京東首頁先隨便搜一個商品,以“男外套“為例子吧:
這是“男外套”第一頁的URL:
'''https://search.jd.com/Search?keyword=%E7%94%B7%E5%A4%96%E5%A5%97&enc=utf-8&pvid=7fd9c2174f0b403da73119cfc5fe2f03'''
繼續點擊第二頁、第三頁,把對應的URL復制下來進行分析
第二頁:
'''https://search.jd.com/Search?keyword=%E7%94%B7%E5%A4%96%E5%A5%97&page=3&s=51&click=0'''
第三頁
'''https://search.jd.com/Search?keyword=%E7%94%B7%E5%A4%96%E5%A5%97&page=5&s=101&click=0'''
然后進行分析,在keyword后面更換一下商品名稱復制到瀏覽器中打開,會打開京東商城搜索更換的商品名稱的頁面,
例如把第三頁中的keyword后面的”%E7%94%B7%E5%A4%96%E5%A5%97“這一串字串換為“女外套”,我們發現商城頁面從“男外套”變成了“女外套”并已經進行了搜索
關鍵問題來了:當前頁面只是第一頁,怎么使網址變成第二頁、第三頁、第N頁呢,繼續分析之前復制三個頁面的URL,發現URL中有一個單詞page,于是我試著去修改“page=”后面的數字,將3改為7,發現頁面跳到了第4頁
之前復制的第二個和第三個URL“page=”后面分別是3、5,由于搜索商品的頁面默認是第一頁,復制下來的URL也跟第二頁、第三頁差別比較大,于是我試著將“page=”后面的數字改為1,發先頁面跳到了第一頁;于是我們的URL就可以確定了:
url="https://search.jd.com/Search?keyword="+key+"&wq="+key+"&page="+str(i*2-1);
然后對頁面進行訪問并讀取編碼:
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
5.正則運算式的確定
查看搜索商品頁面的源代碼,在商品搜索界面先隨便復制一張商品圖的影像地址,復制在文本中,然后選擇復制其中的一段(因為全部復制有可能找不到,實際圖片地址和頁面源代碼里面的圖片地址的格式可能不太一樣),例如我復制任意一個商品的圖片地址中的一段在源代碼中進行搜索
發現商品圖片地址前面的標簽是“data-lazy-img”然后再在源代碼頁面搜索此標簽,發現"data-lazy-img"標簽后面都是商品圖片的圖片地址,于是可以設定正則運算式:
pat='data-lazy-img="(.*?)"'
然后再進行:
imagelist=re.compile(pat).findall(data)
6.大圖的爬取(之前的圖片地址是小圖)
先在搜索頁面復制一張圖片的地址到文本,然后再點進商品,去查看大圖,再復制商品圖片的地址到文本,進行分析,例如
小圖圖片地址'''https://img14.360buyimg.com/n7/jfs/t1/112463/24/19126/94054/5f7199a9E0a24e8f5/21931f19ee2f4874.jpg'''
大圖圖片地址'''https://img14.360buyimg.com/n0/jfs/t1/112463/24/19126/94054/5f7199a9E0a24e8f5/21931f19ee2f4874.jpg'''
從上圖片地址分析得到只有一處不一樣,那就是/n7和/n0,于是需要把爬取出來的字串中的“/n7”換為"/n0":
b1=imagelist[j].replace('/n7', '/n0')
注意:爬取的圖片地址直接是打不開的,需要在前面加個“http:”
newurl="http:"+b1
以下是此程式的完整代碼:
import urllib.request
import re
keyname="AJ"#輸入商品名稱
key=urllib.request.quote(keyname)
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
for i in range(1,10):
url="https://search.jd.com/Search?keyword="+key+"&wq="+key+"&page="+str(i*2-1);
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
pat='data-lazy-img="(.*?)"'
imagelist=re.compile(pat).findall(data)
for j in range(0,len(imagelist)):
b1=imagelist[j].replace('/n7', '/n0')
print("第"+str(i)+"頁第"+str(j)+"張爬取成功")
newurl="http:"+b1
file="E:/新建檔案夾/AJ/"+"第"+str(i)+"頁第"+str(j)+"張"+".jpg"#file指先在指定檔案夾里建立相關的檔案夾才能爬取成功
urllib.request.urlretrieve(newurl, filename=file)
結語
作為爬蟲初學者,很樂意分享一些簡單的小程式,可能有很多描述得不夠專業,但是也比較詳細了(歡迎指正批評)!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/169971.html
標籤:其他
上一篇:Python作業,求詳細代碼
