利用Python爬蟲爬取指定天貓店鋪全店商品資訊

2022-07-30 03:54:11 字數 4846 閱讀 3204

本編部落格是關於爬取天貓店鋪中指定店鋪的所有商品基礎資訊的爬蟲,爬蟲執行只需要輸入相應店鋪的網域名稱名稱即可,資訊將以csv**的形式儲存,可以單店爬取也可以增加乙個迴圈進行同時爬取。

首先還是完整**展示,後面會分解每個函式的意義。

'''建立乙個含有標題的**'''

title = ['item_id','price','quantity','sold','title','totalsoldquantity','url','img']

with open(self.filename,'w',newline='') as f:

writer = csv.dictwriter(f,fieldnames=title)

writer.writeheader()

return

def get_totalpage(self):

'''提取總頁碼數'''

num = random.randint(83739921,87739530)

endurl = '/shop/shop_auction_search.do?sort=s&p=1&page_size=12&from=h5&ajson=1&_tm_source=tmallsearch&callback=jsonp_{}'

url = self.url + endurl.format(num)

html = requests.get(url,headers=self.headers).text

infos = re.findall('\(()\)',html)[0]

infos = json.loads(infos)

totalpage = infos.get('total_page')

return int(totalpage)

def get_products(self,page):

'''提取單頁商品列表'''

num = random.randint(83739921, 87739530)

endurl = '/shop/shop_auction_search.do?sort=s&p={}&page_size=12&from=h5&ajson=1&_tm_source=tmallsearch&callback=jsonp_{}'

url = self.url + endurl.format(page,num)

html = requests.get(url, headers=self.headers).text

infos = re.findall('\(()\)', html)[0]

infos = json.loads(infos)

products = infos.get('items')

title = ['item_id', 'price', 'quantity', 'sold', 'title', 'totalsoldquantity', 'url', 'img']

with open(self.filename, 'a', newline='') as f:

writer = csv.dictwriter(f, fieldnames=title)

writer.writerows(products)

def main(self):

'''迴圈爬取所有頁面寶貝'''

total_page = self.get_totalpage()

for i in range(1,total_page+1):

self.get_products(i)

print('總計{}頁商品,已經提取第{}頁'.format(total_page,i))

time.sleep(1+random.random())

if __name__ == '__main__':

storename = 'uniqlo'

tm = tm_producs(storename)

tm.main()首先通過分析手機端天貓店鋪所有商品的網頁,可以發現每次下滑一頁都有乙個 js 被載入,這個 js 的規律可以總結一下;

通過分析可以發現每次請求 js 都可以得到乙個關鍵資訊,那就是 total_page 這個引數,這也一想就能猜到,就是當前店鋪的總頁碼數,所以可以先取得這個數字,然後使用迴圈爬取全店商品;

每一頁有24個商品,而請求得到的是乙個類似於 json 格式的網頁資訊,但是並非是直接的 json,所以可以用正規表示式提取符合 json 格式的部分留用;

將每一頁的資訊儲存到 csv **中,可以直接使用 csv 庫的字典儲存方式,非常方便;

得到了單頁的資訊,也得到了總頁碼數,只需要乙個迴圈就可以爬取全店的商品了。

self.get_file()上面**依次完成以下操作:

def get_file(self):

'''建立乙個含有標題的**'''

title = ['item_id','price','quantity','sold','title','totalsoldquantity','url','img']

with open(self.filename,'w',newline='') as f:

writer = csv.dictwriter(f,fieldnames=title)

writer.writeheader()

return

這個函式的用意是建立乙個帶有標題的**,標題就是提取的網頁資訊中的 key,這個必須跟需要提取的引數保持一致。關於 csv 庫按照字典格式儲存資訊的方式可以參考之前的一篇文章 python 內建 csv 模組簡介,使用三種方式寫入 csv **

def get_totalpage(self):

'''提取總頁碼數'''

num = random.randint(83739921,87739530)

endurl = '/shop/shop_auction_search.do?sort=s&p=1&page_size=12&from=h5&ajson=1&_tm_source=tmallsearch&callback=jsonp_{}'

url = self.url + endurl.format(num)

html = requests.get(url,headers=self.headers).text

infos = re.findall('\(()\)',html)[0]

infos = json.loads(infos)

totalpage = infos.get('total_page')

return int(totalpage)

這個函式其實跟提取資訊的函式是一樣的,只不過需要提取的資訊不一樣而已,這個函式只需要提取總頁碼數。具體步驟是先構造出每頁請求的url,這個需要自己去總結乙個最簡約的鏈結形式,並且盡可能模仿人工瀏覽。

請求網頁會得到乙個類似於 json 的資訊,但是不是純 json ,因此需要使用正則來處理一下,然後需要用到 json 庫來轉換格式為真正的 json 格式。

def get_products(self,page)的用法是跟提取總頁碼數一樣的,只不過這個需要傳入乙個引數,也就是需要爬取的頁碼數,這樣就可以改變 url 從而爬取對應的頁碼的資訊了。

最後提取每頁的資訊在 json 中是形成乙個列表的形式,而每個列表又是乙個字典,所以可以直接使用 csv 的多行寫入的方法去儲存資訊。

def main(self):

'''迴圈爬取所有頁面寶貝'''

total_page = self.get_totalpage()

for i in range(1,total_page+1):

self.get_products(i)

print('總計{}頁商品,已經提取第{}頁'.format(total_page,i))

time.sleep(1+random.random())

最後乙個函式就是使用迴圈的方式去爬取所有頁面的資訊並儲存了,同時可以在每次爬完一頁之後列印一句話作為提示,並且為了盡可能的減少ip被封的可能性,可以適當的增加一下爬取延遲。

利用Python爬蟲爬取京東(小規模)

一.開發環境 本文執行環境為windows10 python3.7 使用的第三方庫有selenium 操作瀏覽器 pymysql 資料庫 bs4 解析 chrome chromedriver 二.先決條件 利用京東的搜尋結果,然後把結果儲存起來 那麼接下來就是找到京東搜尋的相關url。因為可見即可爬...

利用beautiful soup爬取歷史天氣資料

利用beautiful soup爬取歷史天氣資料 本文將會涉及requests.get 返回結果為404時,採用模擬瀏覽器訪問的模式。以及當遇到幾個相同的標籤時的處理辦法。由於本人還是個小白,故可能有不好的地方 參考了 以及 文章爬取的 為 如下 目標 爬取2019年香洲的天氣資料,包括最高氣溫,最...

Python 爬蟲爬取網頁

工具 python 2.7 import urllib import urllib2 defgetpage url 爬去網頁的方法 request urllib.request url 訪問網頁 reponse urllib2.urlopen request 返回網頁 return response...