關於Python爬蟲爬淘寶mm詳細教程+存入資料庫
具體思路:進入頁面我們會看見很多圖片,其實每張圖片對應一個URL,然後點選一張圖片我們就會進入到對應主頁,主頁裡面有大量的圖片,我們首先就是獲取到當前頁面的所有url,然後進入每個url獲得對應的每個人的所有圖片。
首先我們進入該網頁,直接F12進入除錯模式,(如果進入不了就右鍵然後點選審查元素)
然後點選左上角的那一個按鈕,從頁面中選擇一個元素,隨後我們選擇第一張,然後就可以發現對應的url, 一般來說我們會複製該url,然後檢視頁面原始碼,搜尋該url,然後獲取該頁面所有的類似url,但是很奇怪這裡我們去原始碼裡面搜尋發現根本搜尋不到該url,原始碼裡面搜不到但是為什麼我審查元素的時候能看到呢,它這裡就是一個ajax非同步了。
我們需要了解兩點:
1、ajax是asynchronous javascript and XML的簡寫,就是非同步的javascript和XML,這一技術能夠向伺服器請求額外的資料而無須解除安裝頁面,會帶來更好的使用者體驗。
2、ajax技術的核心是XMLHttpRequest物件(簡稱XHR)。
然後我們點選網路那個按鈕,然後清空掉頁面上的那些傳輸資訊,我們重新整理網址,然後我們就會得到暫新的傳輸資訊,我們只需要在這些資訊裡面找型別是html而原因是xhr的那條資訊,如圖:
(或許你覺得在這麼多傳輸資訊裡面去找這麼一條xhr資訊有點為難,那麼我們其實可以簡單一點)
我們下拉頁面到最下面會發現有一個下一頁的按鈕,我們點選下一頁,會發現上面的頁面沒有動,而下面的圖片確實更新了,這很顯然就是ajax嘛,所以我們清空掉那些傳輸資訊,然後點選下一頁然後傳輸資訊就少很多了,找到xhr就很簡單了。如下圖:
這樣我們便找到了我們所需要的,從頁面上我們 可以發現是一個post型別的請求,
post型別的請求我們一般只用關注三點:
1、請求的網址
2、請求的型別是post
3、請求的引數
我們點選引數那個按鈕,會得到如下圖這樣一個表單,這就是程式碼裡面那個data資料的由來了。
同時我們多點選幾次下一頁並檢視資訊,會發現對於不同的頁面,請求的網址是一樣的,型別也都是post,變得只是請求引數的裡面的那個currentPage後面的那個數字。是第幾個頁面後面的就是數字幾。
所以我們爬取每個頁面的所有個人主頁的url的時候只需要將引數裡面的currentPage改變就可以了。
(具體實現看程式碼)
然後我們點選響應按鈕,看看這個post請求返回的是什麼?
我們發現返回的是json型別的資料,我們需要用import json 然後json.loads(...)將json型別轉換為原始資料型別即是dict。然後我們可以發現在這個dict裡面可以找到對應頁面的所有人的個人資訊,city、height、weight、realname、等,其中userId非常重要。
看見上面這張圖可以明白userId有多重要了吧,我們訪問的每一個人的主頁的網址都是前面一部分沒變,變得只是後面那個userId。
簡單來說就是隻要拿到了userId我們就能去到每個人的主頁,去到每個人的主頁後,拿到她們的圖片還不是輕而易舉?
這裡我們像之前操作那樣,檢視頁面元素,然後發現圖片的地址,然後接著到頁面原始碼裡面去查詢,會發現每個圖片的地址都有兩條,所以我們對查找出來的那些圖片地址的list要進行一個除重(set即可以)
看完再來看這個應該能看的差不多。
import requests,json,re,pymysql
class taobaoMMSpider():
def __init__(self):
self.topUrl = 'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8'
self.basicUrl = 'https://mm.taobao.com/self/aiShow.htm?userId='
self.count = 0
def getuserInfo(self,page):
data = {
'q':'',
'viewFlag':'A',
'sortType':'default',
'searchStyle':'',
'searchRegion':'city:',
'searchFansNum':'',
'currentPage':'%d'%page,
'pageSize':'100',
}
res = requests.post(self.topUrl,data = data)
html = res.text
userInfoList = json.loads(html)['data']['searchDOList']
for userInfo in userInfoList:
name = userInfo['realName']
city = userInfo['city']
height = userInfo['height']
weight = userInfo['weight']
userId = userInfo['userId']
url = self.basicUrl + '%s'%userId
#print(url)
res = requests.get(url)
html = res.text
imageUrlRe = r'(//img.alicdn.com/imgextra/.*?)"'
imageUrlList = list(set(re.findall(imageUrlRe,html)))
#print(imageUrlList)
self.count +=1
print(self.count,'正在爬取%s的資訊'%name,'她一共%s張圖片'%len(imageUrlList))
for imageUrl in imageUrlList:
self.conndb().execute("insert into image(`name`,`city`,`height`,`weight`,`imageUrl`) values('{}','{}','{}','{}','{}')".format(name,city,height,weight,imageUrl))
self.db.commit()
def conndb(self):
self.db = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'test1',
password = '5531663',
db = 'taobaomm',
charset = 'utf8',
)
cursor = self.db.cursor()
return cursor
spider = taobaoMMSpider()
for page in range(1,167):
spider.getuserInfo(page)
效果圖:一會就存進了10000條圖片url。
===================================================================================================
以上,如有不足請多指教。Thanks~!