1. 程式人生 > >關於Python爬蟲爬淘寶mm詳細教程+存入資料庫

關於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~!