python爬虫淘宝评论_Python爬取淘宝店铺和评论
1 安裝開發(fā)需要的一些庫
(1) 安裝mysql 的驅動:在Windows上按win+r輸入cmd打開命令行,輸入命令pip install pymysql,回車即可。
(2) 安裝自動化測試的驅動selenium:在命令行中輸入pip install selenium回車。
(3) 安裝標簽解析庫pyquery: 在命令行中輸入pip install pyquery回車。
(4) Anaconda指的是一個開源的Python發(fā)行版本,其包含了conda、Python等180多個科學包及其依賴項,下載anaconda,安裝后配置環(huán)境變量,在path中添加E:\Anaconda3\anaconda\Library\bin,重啟電腦使環(huán)境變量生效,安裝jieba庫,在命令行中輸入pip install jieba回車。
index.html,并將chromedriver.exe放在Python安裝目錄的Scripts文件夾下。
2.實現(xiàn)
2.1 搜索模塊
搜索功能即一個數(shù)據(jù)框和一個搜索按鈕組成,點擊搜索之后會跳轉到顯示框的界面,之后點擊爬取數(shù)據(jù)可以在淘寶網(wǎng)站中對該商品進行搜索,并且爬取相關店鋪的信息,并儲存到數(shù)據(jù)庫中。
界面顯示用到Tkinter庫,Tkinter 是 Python 的標準 GUI 庫。Python 使用 Tkinter 可以快速的創(chuàng)建 GUI 應用程序。
搜索主要用到selenium,也就是自動化測試工具,測試中根據(jù)pyquery中的提供的方法,在得到網(wǎng)頁源碼的情況下,根據(jù)HTML中的標簽找到輸入框,搜索按鈕和翻頁的按鈕,模擬人工輸入和點擊,實現(xiàn)自動化控制,最后根據(jù)標簽提取出相應的信息插入數(shù)據(jù)庫中。
因為每個網(wǎng)站因網(wǎng)速的的問題都有響應時間,用WebDriverWait(driver,50)設置響應時間為50s,也就是響應超過50s便出現(xiàn)異常。提取數(shù)據(jù)時我用的是find_element_by_css_selector()方法,也就是標簽選擇器,可以定位到相應的區(qū)域。
Python連接數(shù)據(jù)庫用到pymysql,PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務器的一個庫。當?shù)玫綐祟},店鋪名稱,地點,購買人數(shù),店鋪鏈接時,以“|”分割拼接成字符串,作為參數(shù)傳遞給insert_data()方法,插入到數(shù)據(jù)庫中。因為可能會有異常,所以放到try塊中。
爬取數(shù)據(jù)的實現(xiàn)主要是用到了Pyquery、selenium庫,以下代碼主要實現(xiàn)了對淘寶的檢索、翻頁和對數(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
# 設置網(wǎng)站最大響應時間
wait=WebDriverWait(driver,50)
class TaoBaoSearch:
# 初始化,默認搜索為None,創(chuàng)建數(shù)據(jù)庫連接
def __init__(self,search=None):
self.name=search
self.mysql=to.Data_oper()
# 對淘寶網(wǎng)的搜索
def search(self):
# 設置源網(wǎng)站,這里設置淘寶網(wǎng)站為源網(wǎng)站
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()該方法的作用是加載出來搜索結果總頁數(shù)之后開始往下執(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)
# 該方法返回搜索結果的總頁數(shù)
return total.group(0)
# 提取出相應的數(shù)據(jù)
def parseHtml(self):
html=driver.page_source#獲取網(wǎng)頁源代碼
doc=qp(html)
# 得到到class為m-itemlist下面的class是.items .item的div
iteams=doc(".m-itemlist .items .item").items()
# 根據(jù)標簽選擇器提取出需要的數(shù)據(jù)
for itemin iteams:
# src=item(".pic .img").attr("src")
src=item(".row .J_ClickStat").attr("href")# 該店鋪的鏈接
person=item(".row .deal-cnt").text()#購買該商品的人數(shù)
title=item(".row .J_ClickStat").text().split("\n")# 標題
shop=item(".row .shopname").text()# 商品
location=item(".row .location").text()# 地區(qū)
# 將提取到的數(shù)據(jù)放到數(shù)組中保存起來
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())
# 調(diào)用mysql.insert_data()方法將提取到的數(shù)據(jù)插入到數(shù)據(jù)庫中
self.mysql.insert_data(data)
# 對網(wǎng)頁進行翻頁的方法
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()
# 定義主函數(shù),調(diào)用上面的的方法
def main(self):
total=int(self.search())
for iin range(2,total):
self.nextpage(i)
self.mysql.close()
2.2 顯示模塊
當點擊搜索之后,考慮到可能搜索的商品會有本地儲存,所以沒有對其直接搜索,而是在顯示框中增加了一個爬取數(shù)據(jù)的按鈕,該按鈕即對商品進行搜索,而本地數(shù)據(jù)就是對數(shù)據(jù)庫的data表進行查詢,并將數(shù)據(jù)顯示到界面上來。排序是對本地數(shù)據(jù)按購買人數(shù)進行排序,并顯示在文本框中,在顯示行數(shù)后面輸入數(shù)字后,可以控制文本框的顯示條數(shù),默認顯示10條。一鍵刪除即把data表中的數(shù)據(jù)清空。
本地數(shù)據(jù):對數(shù)據(jù)庫中的data表進行查詢,并將信息顯示到文本框中,其中每條數(shù)據(jù)中間以“——”分開,每個字段之間以“|”分隔,因為考慮到店鋪名稱或是標題太長而不整齊,所以每個字段顯示10個字符。
排序:當點擊排序之后,會查詢出數(shù)據(jù)庫中每條數(shù)據(jù)的購買人數(shù)和店鋪名稱,并且以“,”分割拼接成字符串,設置一個元組(即數(shù)組性質),并根據(jù)用戶輸入的顯示行數(shù),控制元組的長度,具體實現(xiàn):根據(jù)從數(shù)據(jù)庫中得到的數(shù)據(jù),每條每條的讀取,當讀取條數(shù)達到用戶輸入的顯示行數(shù)的值,對元組中的數(shù)據(jù)用sort(reverse=True)對其進行從大到小排序:原理是:因購買人數(shù)一個月不超過一百萬,所以得到的購買人數(shù)的最大長度為6位,這樣,當每次讀取的購買人數(shù)的長度不夠6位時,在其前面補0,這樣,購買人數(shù)的長度都為6,對其拼接的格式為“購買人數(shù),店鋪名稱”,因為拼接后為字符串類型,所以用shot排序時會根據(jù)前面的購買人數(shù)進行字典序進行排序,進而前n條數(shù)據(jù)就排好序了,接著,每讀取一條數(shù)據(jù)就對元組中最后一個數(shù)據(jù)進行比較,若是大于其數(shù)值,就插入到元組中,最后返回元組,這樣,就實現(xiàn)了顯示n條購買人數(shù)最多的數(shù)據(jù)。清除數(shù)據(jù):對文本框中的數(shù)據(jù)進行清空,同時,刪除data表中的數(shù)據(jù)。
以下代碼是一個排序的算法,其主要作用是在界面上顯示多少行數(shù)據(jù),主要思路為:根據(jù)用戶輸入的數(shù)字創(chuàng)建一個數(shù)組,讀取數(shù)據(jù)庫中得到數(shù)據(jù),分離出來購買人數(shù)并轉換成int類型,將數(shù)據(jù)每次添加一個到數(shù)組中,當數(shù)組的長度等于用戶想要顯示最大行數(shù)時,對其數(shù)組中的數(shù)據(jù)從大到小進行排序,接下來,每當讀取一個數(shù)據(jù)之后,就對數(shù)組中最小的那個進行比較,如果比起小,就跳過,否則,對該數(shù)據(jù)進行插入操作,并刪除之前最小的那個數(shù)據(jù),最后數(shù)組中保存的就是購買人數(shù)最多的前n條數(shù)據(jù)。
主要代碼如下:
#對數(shù)據(jù)進行排序,data為購買人數(shù)
def shot_data(self,data,i=10): # i為用戶想要顯示的最大行數(shù),默認為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ù)進行排序
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個數(shù)的數(shù)組
2.3 評論模塊
點擊查看鏈接之后會出現(xiàn)一個搜索框,即根據(jù)店鋪名稱搜索出相關的連接,點擊查看評論之后可以對其店鋪進行爬取,最后顯示在評論框中。分析就是對評論進行關鍵詞提取,并按權重顯示出前n個詞。點擊查看評論進行自動化測試。
搜索店鋪鏈接:根據(jù)用戶輸入的信息對數(shù)據(jù)庫進行模糊查詢,返回所有的匹配信息。并顯示在文本框中。
爬取評論:首先清空comment表中的數(shù)據(jù),根據(jù)curselection()方法得到用戶選中的鏈接,接著對該鏈接進行爬取,在進入該店鋪時,會提示需要登錄,這樣會對我們的自動化測試造成一定的阻礙,這里,我根據(jù)pyquery中提供的標簽選擇器,找到關閉按鈕,模擬點擊進行關閉,當進入店鋪后,依舊是先得到該網(wǎng)頁的源代碼,根據(jù)標簽選擇器進行相應的操作,爬取到的評論時間,評論和購買物品以“|”拼接成字符串,顯示到文本框的同時插入到數(shù)據(jù)庫中。
評論分析:jieba是Python的中文分詞組件。當查詢到comment表中所有數(shù)據(jù)時,將每一條數(shù)據(jù)拼接成一個字符串,接著用jieba.posseg中的cut()方法,將評論分割成單個詞并標注詞性,用startswith('a')、startswith('v')得到形容詞和動詞。最后用jieba.analyse.extract_t
ags(v,topK=10)方法得到動詞、形容詞中權重較大的前10個詞。
以下代碼是對評論進行關鍵詞的提取,用到了jieba庫中的一些方法。
主要代碼如下:
def dis_an(self):
# 清空顯示界面
self.txtMess.delete(1.0,END)
t=to.Data_oper()
# 得到數(shù)據(jù)庫中的存儲信息
test=t.dis_only_discuss()
# 定義字符串a(chǎn)dg,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
# 根據(jù)該詞的權重提取出前5個詞
tags=jieba.analyse.extract_tags(adg,topK=5)
tags1=jieba.analyse.extract_tags(v,topK=5)
總結
以上是生活随笔為你收集整理的python爬虫淘宝评论_Python爬取淘宝店铺和评论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: linux blender骨骼绑定,Li
- 下一篇: 分析师喊出A股4000点 方正证券回应启
