【Python爬蟲案例學習】Python爬取淘寶店鋪和評論


安裝開發需要的一些庫

(1) 安裝mysql 的驅動:在Windows上按win+r輸入cmd打開命令行,輸入命令pip install pymysql,回車即可。

(2) 安裝自動化測試的驅動selenium:在命令行中輸入pip install selenium回車。

(3) 安裝標簽解析庫pyquery: 在命令行中輸入pip install pyquery回車。

(4) Anaconda指的是一個開源的Python發行版本,其包含了conda、Python等180多個科學包及其依賴項,下載anaconda,安裝后配置環境變量,在path中添加E:\Anaconda3\anaconda\Library\bin,重啟電腦使環境變量生效,安裝jieba庫,在命令行中輸入pip install jieba回車。

(5) 下載ChromeDriver,官方網址為:http://chromedriver.storage.googleapis.com/

index.html,並將chromedriver.exe放在Python安裝目錄的Scripts文件夾下。

實現

  • 爬取數據的實現主要是用到了Pyquery、selenium庫,以下代碼主要實現了對淘寶的檢索、翻頁和對數據的提取。
'''
遇到不懂的問題?Python學習交流群:821460695滿足你的需求,資料都已經上傳群文件,可以自行下載!
'''
# 設置網站最大響應時間
wait=WebDriverWait(driver,50)
class TaoBaoSearch:
# 初始化,默認搜索為None,創建數據庫連接
    def __init__(self,search=None):
        self.name=search
        self.mysql=to.Data_oper()
# 對淘寶網的搜索
    def search(self):
# 設置源網站,這里設置淘寶網站為源網站
        driver.get("https://www.taobao.com/")#J_TSearchForm > div.search-button > button
# “q”為淘寶首頁輸入框的標簽,這里定位到該輸入框,並設置要搜索商品的名字
        imput=driver.find_element_by_id("q")
        imput.send_keys(self.name)
# wait.until()該方法的作用是加載出來搜索結果總頁數之后開始往下執行
        pageText=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#mainsrp-pager > div > div > div > div.total")))
        total=re.search("\d+",pageText.text)
# 該方法返回搜索結果的總頁數
        return total.group(0)
# 提取出相應的數據
    def parseHtml(self):
        html=driver.page_source#獲取網頁源代碼
        doc=qp(html)
# 得到到class為m-itemlist下面的class是.items .item的div
        iteams=doc(".m-itemlist .items .item").items()
# 根據標簽選擇器提取出需要的數據
        for item in iteams:
            # src=item(".pic .img").attr("src")
            src=item(".row .J_ClickStat").attr("href")  # 該店鋪的鏈接
            person=item(".row .deal-cnt").text()    #購買該商品的人數
            title=item(".row .J_ClickStat").text().split("\n")  # 標題
            shop=item(".row .shopname").text()  # 商品
            location=item(".row .location").text()  # 地區
       # 將提取到的數據放到數組中保存起來
            data=[]
            data.append(str(title[0].strip()))
            data.append(str(shop.strip()))
            data.append(str(location.strip()))
       # 剔除無用字
            data.append(str(person[:-3].strip()))
            data.append(str(src).strip())
# 調用mysql.insert_data()方法將提取到的數據插入到數據庫中
            self.mysql.insert_data(data)
#  對網頁進行翻頁的方法
    def nextpage(self,pagenumber):
# 定位到翻頁的按鈕前的輸入框,也就是對其進行跳轉
        pageInput=driver.find_element_by_css_selector("#mainsrp-pager > div > div > div > div.form > input")
        pageInput.clear()
        pageInput.send_keys(pagenumber)
# 定位到跳轉按鈕,對其進行翻頁
        pageButton=driver.find_element_by_css_selector("#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit")
        pageButton.click()
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,"#mainsrp-pager > div > div > div > ul > li.item.active > span"),str(pagenumber)))
        self.parseHtml()
# 定義主函數,調用上面的的方法
    def main(self):
        total=int(self.search())
        for i in range(2,total):
            self.nextpage(i)
        self.mysql.close()

以下代碼是一個排序的算法,其主要作用是在界面上顯示多少行數據,主要思路為:根據用戶輸入的數字創建一個數組,讀取數據庫中得到數據,分離出來購買人數並轉換成int類型,將數據每次添加一個到數組中,當數組的長度等於用戶想要顯示最大行數時,對其數組中的數據從大到小進行排序,接下來,每當讀取一個數據之后,就對數組中最小的那個進行比較,如果比起小,就跳過,否則,對該數據進行插入操作,並刪除之前最小的那個數據,最后數組中保存的就是購買人數最多的前n條數據。

主要代碼如下:

'''
遇到不懂的問題?Python學習交流群:821460695滿足你的需求,資料都已經上傳群文件,可以自行下載!
'''
#對數據進行排序,data為購買人數
def shot_data(self,data,i=10):    # i為用戶想要顯示的最大行數,默認為10行
    top=[]
    if i>len(data):
        i=len(data)
    for x in data:
        if len(top)<i:     # 控制數組的長度,另其大小等於i
            top.append(x)
            if len(top)==i:
                top.sort(reverse=True)        # 數組內的數據進行排序
        else:
            l=len(top)
            y=len(top)
            t=1
            if x>top[l-1]:    # 判斷其數值是否大於數組內的最小值
                while x>top[l-t] and y>0:    # 控制循環條件
                    t+=1
                    y-=1
                if y!=0:    # y的值若是==0,那么該數值就是最大值
                    for c in range(1,t):
                        top[l-c]=top[l-c-1]
                    top[l-t+1]=x
                else:
                   for c in range(1,t):
                       top[l-c]=top[l-c-1]
                   top[0]=x
    return top    # 返回裝有最大的前i個數的數組

以下代碼是對評論進行關鍵詞的提取,用到了jieba庫中的一些方法。
主要代碼如下:

def dis_an(self):
# 清空顯示界面
    self.txtMess.delete(1.0,END)
    t=to.Data_oper()
# 得到數據庫中的存儲信息
    test=t.dis_only_discuss()
# 定義字符串adg,v
    adg=""
    v=""
# 對評論進行分割並標注詞性
    word=psg.cut(test)
# w為詞意,f為詞性
    for w,f in word:
    # 判斷詞性是否為形容詞
        if f.startswith('a'):
            print(w)
            adg=adg+","+w
    # 判斷詞性是否為動詞
        elif f.startswith('v'):
            v=v+","+w
    # 根據該詞的權重提取出前5個詞
tags=jieba.analyse.extract_tags(adg,topK=5)
    tags1=jieba.analyse.extract_tags(v,topK=5)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM