1. 程式人生 > 實用技巧 >通過python爬蟲爬取淘寶資訊

通過python爬蟲爬取淘寶資訊

爬取內容

爬取淘寶上的褲子資訊,包括褲子名字,圖片,價格以及銷售量

爬取過程

首先分析淘寶網頁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 李文軒