通過python爬蟲爬取淘寶資訊
阿新 • • 發佈:2020-12-14
爬取內容
爬取淘寶上的褲子資訊,包括褲子名字,圖片,價格以及銷售量
爬取過程
首先分析淘寶網頁url
第一頁:
第二頁:
第三頁:
最後的數字從零開始,每增加一頁,數字增加44,由此可以根據第一頁的url得到後面網頁的url
十頁網頁url的列表:
original_url = "https://s.taobao.com/search?q=%E8%A3%A4%E5%AD%90&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20201213&ie=utf8&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s=" url_list=list() for i in range(1, 11): url=original_url+str((i-1)*44) url_list.append(url)
分析淘寶網頁原始碼
元素審查詢到具體資訊,可以找到資訊儲存在div class="item J_MouserOnverReq item-ad "或div class="item J_MouserOnverReq "中
但是檢視requests請求下來的網頁程式碼和瀏覽器中元素審查不同,並沒有div,class="item J_MouserOnverReq "的標籤
論壇找到解答 https://www.cnblogs.com/yuantup/p/9761534.html
我的解決方法:直接利用爬取下來的網頁原始碼進行正則表示式的匹配,找到所需要的資訊
可以從原始碼中找到
raw_title: 對應商品名稱
pic_url: 對應照片的url
view_price: 對應商品價格
view_sales: 對應商品的銷量
利用正則表示式找到所有匹配的元素
name=re.findall(r'"raw_title":"(.*?)"', response)
pic=re.findall(r'"pic_url":"(.*?)"', response)
price=re.findall(r'"view_price":"(.*?)"', response)
sales=re.findall(r'"view_sales":"(.*?)"', response)
列印每個列表的長度
print(len(name)) print(len(pic)) print(len(price)) print(len(sales)) #44 #44 #44 #44
長度匹配,所以列表中相同下標對應相同元素
圖片獲取並向檔案中寫資訊
fp=open("./image/info.md", 'w', encoding='utf-8')
slen=len(name)
print(slen)
for i in range(0, slen):
im_name=str(pic[i]).split('/')[-1]
im=open("./image/"+im_name, 'wb')
im_url = "http:"+str(pic[i])
image=requests.get(im_url, headers=headers).content
im.write(image)
im.close()
fp.write("##### "+str(name[i])+'\n'+"價格: "+str(price[i])+'\n'+str(sales[i])+'\n')
fp.write("!["+str(name[i])+"]("+im_name+")"+'\n')
#圖片markdown格式:![這是圖片](/assets/img/philly-magic-garden.jpg)
time.sleep(1)
fp.close()
執行結果
共433個圖片
markdown檔案中
最終程式碼
import requests
import re
import time
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36 Edg/86.0.622.43",
"cookie": "請自行填充"
}
original_url = "https://s.taobao.com/search?q=%E8%A3%A4%E5%AD%90&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20201213&ie=utf8&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s="
url_list=list()
for i in range(1, 11):
url=original_url+str((i-1)*44)
url_list.append(url)
fp=open("./image/info.md", 'w', encoding='utf-8')
for url in url_list:
response=requests.get(url, headers=headers).text
name=re.findall(r'"raw_title":"(.*?)"', response)
pic=re.findall(r'"pic_url":"(.*?)"', response)
price=re.findall(r'"view_price":"(.*?)"', response)
sales=re.findall(r'"view_sales":"(.*?)"', response)
slen=len(name)
print(slen)
for i in range(0, slen):
im_name=str(pic[i]).split('/')[-1]
im=open("./image/"+im_name, 'wb')
im_url = "http:"+str(pic[i])
image=requests.get(im_url, headers=headers).content
im.write(image)
im.close()
fp.write("##### "+str(name[i])+'\n'+"價格: "+str(price[i])+'\n'+str(sales[i])+'\n')
fp.write("!["+str(name[i])+"]("+im_name+")"+'\n')
#markdown圖片格式:![這是圖片](/assets/img/philly-magic-garden.jpg)
time.sleep(1)
fp.close()
注意事項(反爬蟲):User-Agent和cookie都不能缺少
缺少User-Agent會缺少訪問許可權
缺少cookie會抓取到登陸介面
另一種解決方法-利用selenium模擬,並返回網頁原始碼
selenium不能用cookie,所以需要模擬登陸
輸入手機號的標籤id
輸入密碼的標籤id
登陸按鈕的class名字
登陸淘寶網並將網頁返回傳給BeautifulSoup
程式碼:
ori_url="https://s.taobao.com/search?q=%E8%A3%A4%E5%AD%90&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20201213&ie=utf8&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s="
driver=webdriver.Chrome()
driver.maximize_window()
#模擬登入
driver.get(ori_url)
time.sleep(1)
driver.find_element_by_id('fm-login-id').clear()
driver.find_element_by_id('fm-login-id').send_keys('15703613658')
time.sleep(1)
driver.find_element_by_id('fm-login-password').clear()
driver.find_element_by_id('fm-login-password').send_keys('*********')#password
time.sleep(1)
driver.find_element_by_class_name('fm-button').click()
time.sleep(5)
data=driver.page_source.encode('utf-8')
soup=BeautifulSoup(data,features='lxml')
成功找到和圖片有關標籤
alt對應商品名稱,src和data-src都有可能對應圖片url,但data-src一定會對應,所以用data-src獲取圖片
儲存圖片
img_list=soup.find_all('img',class_="J_ItemPic img")
for img in img_list:
fp.write(str(img))
name=img['alt']
url='http:'+img['data-src']
image=requests.get(url).content
i=open('./selenium_image/'+name+'.jpg','wb')
i.write(image)
i.close()
print(name)
最終爬取到一頁中商品名稱和圖片
最終程式碼
from selenium import webdriver
from bs4 import BeautifulSoup
import time
import re
import requests
ori_url="https://s.taobao.com/search?q=%E8%A3%A4%E5%AD%90&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20201213&ie=utf8&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s="
driver=webdriver.Chrome()
driver.maximize_window()
#模擬登入
driver.get(ori_url)
time.sleep(1)
driver.find_element_by_id('fm-login-id').clear()
driver.find_element_by_id('fm-login-id').send_keys('15703613658')
time.sleep(1)
driver.find_element_by_id('fm-login-password').clear()
driver.find_element_by_id('fm-login-password').send_keys('********')#password
time.sleep(1)
driver.find_element_by_class_name('fm-button').click()
time.sleep(5)
data=driver.page_source.encode('utf-8')
soup=BeautifulSoup(data,features='lxml')
fp=open('./selenium_image/source.txt','w',encoding='utf-8')
img_list=soup.find_all('img',class_="J_ItemPic img")
for img in img_list:
fp.write(str(img))
name=img['alt']
url='http:'+img['data-src']
image=requests.get(url).content
i=open('./selenium_image/'+name+'.jpg','wb')
i.write(image)
i.close()
print(name)
fp.close()
注意事項
模擬點選登陸後,需要等待幾秒再返回page_source,否則會返回之前的網頁的原始碼
更多
更新到下一頁,可以通過selenium模擬點選下一頁按鈕
抓取價格和銷售量資訊
因為比較懶而且看起來很麻煩,所以沒有做
集美大學 計算1913 李文軒