Ajax數據的爬取(淘女郎爲例)
若有疑問,轉到 Wikipython
網址:https://0x9.me/xrh6zgit
查看網頁源代碼,查找網頁中加載的數據信息,若是源代碼中不顯示,證實是 Ajax 加載。
若是是網站源代碼中就包含要爬取的信息,那麼就直接只用正則拿數據出來就好了
可是若是網頁源碼中沒有,那麼就是 Ajax 了,能夠進行抓包找到獲取數據的相關接口,操做以下(以爬取淘女郎美女信息爲例):github
若是使用的是 Chrome 的話,能夠首先選中 XHR 來更快速的找出獲取數據的 API,若是在 XHR 裏面沒有再去 JS 裏面一個個的尋找。ajax
通過嘗試,後面的參數都是能夠去掉的,訪問的時候默認 page 爲 1 ,因此若是要獲取到全部頁,須要使用 for 循環分別獲取每一頁的模特列表。正則表達式
下面咱們抓取全部的妹子數據到文件中:json
下面貼出代碼:dom
a. myheaders.py ----這個文件裏保存了一些經常使用的 headers 頭信息ide
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date: 2018-02-02 19:40:50 # @Author : cnsimo (2020745751@qq.com) # @Link: http://www.scriptboy.com # @Version : 1.0 import random uaStr = '''Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0) Mozilla/5.0 (Windows NT 6.1; rv,2.0.1) Gecko/20100101 Firefox/4.0.1 Mozilla/5.0 (Windows NT 6.1; rv,2.0.1) Gecko/20100101 Firefox/4.0.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11 Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0) MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1''' def getUA(): uaList = uaStr.split('\n') length = len(uaList) return uaList[random.randint(0,length-1)] if __name__ == '__main__': print(getUA())
b. mmtao.py -----主程序函數
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date: 2018-02-02 23:11:08 # @Author : cnsimo (2020745751@qq.com) # @Link: http://www.scriptboy.com # @Version : 1.0 from myheaders import getUA import requests import re import time import csv mmListUrl = 'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8' mmUrl = '' # 得到總共的頁數 def getTotalPage(): headers = {'User-Agent': getUA()} req = requests.get(mmListUrl, headers=headers) res = req.json() return res['data']['totalPage'] # 獲取列表的函數 def getMMList(cpage = 1): headers = {'User-Agent': getUA()} payload = {'currentPage': cpage, 'pageSize': 100, 'sortType': 'default', 'viewFlag': 'A'} req = requests.post(mmListUrl, headers=headers, data=payload) res = req.json() if 'data' in res.keys(): return res['data']['searchDOList'] else: return if __name__ == '__main__': totalPage = getTotalPage() with open(r'mmlist.csv', 'w+', newline='') as fs: count = 1 cpage = 1 csvwriter = csv.writer(fs, dialect='excel') page1 = getMMList(cpage) csvwriter.writerow(page1[0].keys()) print('正在處理第%s頁。。。' % cpage) for mm in page1: csvwriter.writerow(mm.values()) print(str(count)+' ', end='') count += 1 print() while cpage < totalPage: cpage += 1 print('正在處理第%s頁。。。' % cpage) time.sleep(2) mmList = getMMList(cpage) if not mmList: break for mm in mmList: csvwriter.writerow(mm.values()) print(str(count)+' ', end='') count += 1 print('') print('全部數據處理完畢!')
導出的數據以下:工具
雖說數據已經出來了,可是對模特的描述仍是不夠具體,想要更具體的數據得經過他們的模特卡得到,例如:https://mm.taobao.com/self/model_info.htm?spm=719.7800510.a312r.22.bKq7m9&user_id=277949921
這裏的信息要更加全面一些,因此咱們從列表也只獲取模特 ID ,而後經過模特卡來拿到更加詳細的信息。
部分數據截圖:
代碼詳見: mmtao_plus.py ,若有疑問,轉到 Wiki