日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python爬虫淘宝评论_Python爬取淘宝店铺和评论

發(fā)布時(shí)間:2023/12/10 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬虫淘宝评论_Python爬取淘宝店铺和评论 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 安裝開(kāi)發(fā)需要的一些庫(kù)

(1) 安裝mysql 的驅(qū)動(dòng):在Windows上按win+r輸入cmd打開(kāi)命令行,輸入命令pip install pymysql,回車(chē)即可。

(2) 安裝自動(dòng)化測(cè)試的驅(qū)動(dòng)selenium:在命令行中輸入pip install selenium回車(chē)。

(3) 安裝標(biāo)簽解析庫(kù)pyquery: 在命令行中輸入pip install pyquery回車(chē)。

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

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

2.實(shí)現(xiàn)

2.1 搜索模塊

搜索功能即一個(gè)數(shù)據(jù)框和一個(gè)搜索按鈕組成,點(diǎn)擊搜索之后會(huì)跳轉(zhuǎn)到顯示框的界面,之后點(diǎn)擊爬取數(shù)據(jù)可以在淘寶網(wǎng)站中對(duì)該商品進(jìn)行搜索,并且爬取相關(guān)店鋪的信息,并儲(chǔ)存到數(shù)據(jù)庫(kù)中。

界面顯示用到Tkinter庫(kù),Tkinter 是 Python 的標(biāo)準(zhǔn) GUI 庫(kù)。Python 使用 Tkinter 可以快速的創(chuàng)建 GUI 應(yīng)用程序。

搜索主要用到selenium,也就是自動(dòng)化測(cè)試工具,測(cè)試中根據(jù)pyquery中的提供的方法,在得到網(wǎng)頁(yè)源碼的情況下,根據(jù)HTML中的標(biāo)簽找到輸入框,搜索按鈕和翻頁(yè)的按鈕,模擬人工輸入和點(diǎn)擊,實(shí)現(xiàn)自動(dòng)化控制,最后根據(jù)標(biāo)簽提取出相應(yīng)的信息插入數(shù)據(jù)庫(kù)中。

因?yàn)槊總€(gè)網(wǎng)站因網(wǎng)速的的問(wèn)題都有響應(yīng)時(shí)間,用WebDriverWait(driver,50)設(shè)置響應(yīng)時(shí)間為50s,也就是響應(yīng)超過(guò)50s便出現(xiàn)異常。提取數(shù)據(jù)時(shí)我用的是find_element_by_css_selector()方法,也就是標(biāo)簽選擇器,可以定位到相應(yīng)的區(qū)域。

Python連接數(shù)據(jù)庫(kù)用到pymysql,PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務(wù)器的一個(gè)庫(kù)。當(dāng)?shù)玫綐?biāo)題,店鋪名稱(chēng),地點(diǎn),購(gòu)買(mǎi)人數(shù),店鋪鏈接時(shí),以“|”分割拼接成字符串,作為參數(shù)傳遞給insert_data()方法,插入到數(shù)據(jù)庫(kù)中。因?yàn)榭赡軙?huì)有異常,所以放到try塊中。

爬取數(shù)據(jù)的實(shí)現(xiàn)主要是用到了Pyquery、selenium庫(kù),以下代碼主要實(shí)現(xiàn)了對(duì)淘寶的檢索、翻頁(yè)和對(duì)數(shù)據(jù)的提取。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

# 設(shè)置網(wǎng)站最大響應(yīng)時(shí)間

wait=WebDriverWait(driver,50)

class TaoBaoSearch:

# 初始化,默認(rèn)搜索為None,創(chuàng)建數(shù)據(jù)庫(kù)連接

def __init__(self,search=None):

self.name=search

self.mysql=to.Data_oper()

# 對(duì)淘寶網(wǎng)的搜索

def search(self):

# 設(shè)置源網(wǎng)站,這里設(shè)置淘寶網(wǎng)站為源網(wǎng)站

driver.get("https://www.taobao.com/")#J_TSearchForm > div.search-button > button

# “q”為淘寶首頁(yè)輸入框的標(biāo)簽,這里定位到該輸入框,并設(shè)置要搜索商品的名字

imput=driver.find_element_by_id("q")

imput.send_keys(self.name)

# wait.until()該方法的作用是加載出來(lái)搜索結(jié)果總頁(yè)數(shù)之后開(kāi)始往下執(zhí)行

pageText=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#mainsrp-pager > div > div > div > div.total")))

total=re.search("\d+",pageText.text)

# 該方法返回搜索結(jié)果的總頁(yè)數(shù)

return total.group(0)

# 提取出相應(yīng)的數(shù)據(jù)

def parseHtml(self):

html=driver.page_source#獲取網(wǎng)頁(yè)源代碼

doc=qp(html)

# 得到到class為m-itemlist下面的class是.items .item的div

iteams=doc(".m-itemlist .items .item").items()

# 根據(jù)標(biāo)簽選擇器提取出需要的數(shù)據(jù)

for itemin iteams:

# src=item(".pic .img").attr("src")

src=item(".row .J_ClickStat").attr("href")# 該店鋪的鏈接

person=item(".row .deal-cnt").text()#購(gòu)買(mǎi)該商品的人數(shù)

title=item(".row .J_ClickStat").text().split("\n")# 標(biāo)題

shop=item(".row .shopname").text()# 商品

location=item(".row .location").text()# 地區(qū)

# 將提取到的數(shù)據(jù)放到數(shù)組中保存起來(lái)

data=[]

data.append(str(title[0].strip()))

data.append(str(shop.strip()))

data.append(str(location.strip()))

# 剔除無(wú)用字

data.append(str(person[:-3].strip()))

data.append(str(src).strip())

# 調(diào)用mysql.insert_data()方法將提取到的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中

self.mysql.insert_data(data)

# 對(duì)網(wǎng)頁(yè)進(jìn)行翻頁(yè)的方法

def nextpage(self,pagenumber):

# 定位到翻頁(yè)的按鈕前的輸入框,也就是對(duì)其進(jìn)行跳轉(zhuǎn)

pageInput=driver.find_element_by_css_selector("#mainsrp-pager > div > div > div > div.form > input")

pageInput.clear()

pageInput.send_keys(pagenumber)

# 定位到跳轉(zhuǎn)按鈕,對(duì)其進(jìn)行翻頁(yè)

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()

# 定義主函數(shù),調(diào)用上面的的方法

def main(self):

total=int(self.search())

for iin range(2,total):

self.nextpage(i)

self.mysql.close()

2.2 顯示模塊

當(dāng)點(diǎn)擊搜索之后,考慮到可能搜索的商品會(huì)有本地儲(chǔ)存,所以沒(méi)有對(duì)其直接搜索,而是在顯示框中增加了一個(gè)爬取數(shù)據(jù)的按鈕,該按鈕即對(duì)商品進(jìn)行搜索,而本地?cái)?shù)據(jù)就是對(duì)數(shù)據(jù)庫(kù)的data表進(jìn)行查詢,并將數(shù)據(jù)顯示到界面上來(lái)。排序是對(duì)本地?cái)?shù)據(jù)按購(gòu)買(mǎi)人數(shù)進(jìn)行排序,并顯示在文本框中,在顯示行數(shù)后面輸入數(shù)字后,可以控制文本框的顯示條數(shù),默認(rèn)顯示10條。一鍵刪除即把data表中的數(shù)據(jù)清空。

本地?cái)?shù)據(jù):對(duì)數(shù)據(jù)庫(kù)中的data表進(jìn)行查詢,并將信息顯示到文本框中,其中每條數(shù)據(jù)中間以“——”分開(kāi),每個(gè)字段之間以“|”分隔,因?yàn)榭紤]到店鋪名稱(chēng)或是標(biāo)題太長(zhǎng)而不整齊,所以每個(gè)字段顯示10個(gè)字符。

排序:當(dāng)點(diǎn)擊排序之后,會(huì)查詢出數(shù)據(jù)庫(kù)中每條數(shù)據(jù)的購(gòu)買(mǎi)人數(shù)和店鋪名稱(chēng),并且以“,”分割拼接成字符串,設(shè)置一個(gè)元組(即數(shù)組性質(zhì)),并根據(jù)用戶輸入的顯示行數(shù),控制元組的長(zhǎng)度,具體實(shí)現(xiàn):根據(jù)從數(shù)據(jù)庫(kù)中得到的數(shù)據(jù),每條每條的讀取,當(dāng)讀取條數(shù)達(dá)到用戶輸入的顯示行數(shù)的值,對(duì)元組中的數(shù)據(jù)用sort(reverse=True)對(duì)其進(jìn)行從大到小排序:原理是:因購(gòu)買(mǎi)人數(shù)一個(gè)月不超過(guò)一百萬(wàn),所以得到的購(gòu)買(mǎi)人數(shù)的最大長(zhǎng)度為6位,這樣,當(dāng)每次讀取的購(gòu)買(mǎi)人數(shù)的長(zhǎng)度不夠6位時(shí),在其前面補(bǔ)0,這樣,購(gòu)買(mǎi)人數(shù)的長(zhǎng)度都為6,對(duì)其拼接的格式為“購(gòu)買(mǎi)人數(shù),店鋪名稱(chēng)”,因?yàn)槠唇雍鬄樽址?lèi)型,所以用shot排序時(shí)會(huì)根據(jù)前面的購(gòu)買(mǎi)人數(shù)進(jìn)行字典序進(jìn)行排序,進(jìn)而前n條數(shù)據(jù)就排好序了,接著,每讀取一條數(shù)據(jù)就對(duì)元組中最后一個(gè)數(shù)據(jù)進(jìn)行比較,若是大于其數(shù)值,就插入到元組中,最后返回元組,這樣,就實(shí)現(xiàn)了顯示n條購(gòu)買(mǎi)人數(shù)最多的數(shù)據(jù)。清除數(shù)據(jù):對(duì)文本框中的數(shù)據(jù)進(jìn)行清空,同時(shí),刪除data表中的數(shù)據(jù)。

以下代碼是一個(gè)排序的算法,其主要作用是在界面上顯示多少行數(shù)據(jù),主要思路為:根據(jù)用戶輸入的數(shù)字創(chuàng)建一個(gè)數(shù)組,讀取數(shù)據(jù)庫(kù)中得到數(shù)據(jù),分離出來(lái)購(gòu)買(mǎi)人數(shù)并轉(zhuǎn)換成int類(lèi)型,將數(shù)據(jù)每次添加一個(gè)到數(shù)組中,當(dāng)數(shù)組的長(zhǎng)度等于用戶想要顯示最大行數(shù)時(shí),對(duì)其數(shù)組中的數(shù)據(jù)從大到小進(jìn)行排序,接下來(lái),每當(dāng)讀取一個(gè)數(shù)據(jù)之后,就對(duì)數(shù)組中最小的那個(gè)進(jìn)行比較,如果比起小,就跳過(guò),否則,對(duì)該數(shù)據(jù)進(jìn)行插入操作,并刪除之前最小的那個(gè)數(shù)據(jù),最后數(shù)組中保存的就是購(gòu)買(mǎi)人數(shù)最多的前n條數(shù)據(jù)。

主要代碼如下:

#對(duì)數(shù)據(jù)進(jìn)行排序,data為購(gòu)買(mǎi)人數(shù)

def shot_data(self,data,i=10): # i為用戶想要顯示的最大行數(shù),默認(rèn)為10行

top=[]

if i>len(data):

i=len(data)

for x in data:

if len(top)

top.append(x)

if len(top)==i:

top.sort(reverse=True) # 數(shù)組內(nèi)的數(shù)據(jù)進(jìn)行排序

else:

l=len(top)

y=len(top)

t=1

if x>top[l-1]: # 判斷其數(shù)值是否大于數(shù)組內(nèi)的最小值

while x>top[l-t] and y>0: # 控制循環(huán)條件

t+=1

y-=1

if y!=0: # y的值若是==0,那么該數(shù)值就是最大值

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個(gè)數(shù)的數(shù)組

2.3 評(píng)論模塊

點(diǎn)擊查看鏈接之后會(huì)出現(xiàn)一個(gè)搜索框,即根據(jù)店鋪名稱(chēng)搜索出相關(guān)的連接,點(diǎn)擊查看評(píng)論之后可以對(duì)其店鋪進(jìn)行爬取,最后顯示在評(píng)論框中。分析就是對(duì)評(píng)論進(jìn)行關(guān)鍵詞提取,并按權(quán)重顯示出前n個(gè)詞。點(diǎn)擊查看評(píng)論進(jìn)行自動(dòng)化測(cè)試。

搜索店鋪鏈接:根據(jù)用戶輸入的信息對(duì)數(shù)據(jù)庫(kù)進(jìn)行模糊查詢,返回所有的匹配信息。并顯示在文本框中。

爬取評(píng)論:首先清空comment表中的數(shù)據(jù),根據(jù)curselection()方法得到用戶選中的鏈接,接著對(duì)該鏈接進(jìn)行爬取,在進(jìn)入該店鋪時(shí),會(huì)提示需要登錄,這樣會(huì)對(duì)我們的自動(dòng)化測(cè)試造成一定的阻礙,這里,我根據(jù)pyquery中提供的標(biāo)簽選擇器,找到關(guān)閉按鈕,模擬點(diǎn)擊進(jìn)行關(guān)閉,當(dāng)進(jìn)入店鋪后,依舊是先得到該網(wǎng)頁(yè)的源代碼,根據(jù)標(biāo)簽選擇器進(jìn)行相應(yīng)的操作,爬取到的評(píng)論時(shí)間,評(píng)論和購(gòu)買(mǎi)物品以“|”拼接成字符串,顯示到文本框的同時(shí)插入到數(shù)據(jù)庫(kù)中。

評(píng)論分析:jieba是Python的中文分詞組件。當(dāng)查詢到comment表中所有數(shù)據(jù)時(shí),將每一條數(shù)據(jù)拼接成一個(gè)字符串,接著用jieba.posseg中的cut()方法,將評(píng)論分割成單個(gè)詞并標(biāo)注詞性,用startswith('a')、startswith('v')得到形容詞和動(dòng)詞。最后用jieba.analyse.extract_t

ags(v,topK=10)方法得到動(dòng)詞、形容詞中權(quán)重較大的前10個(gè)詞。

以下代碼是對(duì)評(píng)論進(jìn)行關(guān)鍵詞的提取,用到了jieba庫(kù)中的一些方法。

主要代碼如下:

def dis_an(self):

# 清空顯示界面

self.txtMess.delete(1.0,END)

t=to.Data_oper()

# 得到數(shù)據(jù)庫(kù)中的存儲(chǔ)信息

test=t.dis_only_discuss()

# 定義字符串a(chǎn)dg,v

adg=""

v=""

# 對(duì)評(píng)論進(jìn)行分割并標(biāo)注詞性

word=psg.cut(test)

# w為詞意,f為詞性

for w,f in word:

# 判斷詞性是否為形容詞

if f.startswith('a'):

print(w)

adg=adg+","+w

# 判斷詞性是否為動(dòng)詞

elif f.startswith('v'):

v=v+","+w

# 根據(jù)該詞的權(quán)重提取出前5個(gè)詞

tags=jieba.analyse.extract_tags(adg,topK=5)

tags1=jieba.analyse.extract_tags(v,topK=5)

總結(jié)

以上是生活随笔為你收集整理的python爬虫淘宝评论_Python爬取淘宝店铺和评论的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。