用Python爬取京東商品評論(1)

Python網絡爬蟲所需要的模塊

本次爬蟲程序需要的模塊有:
requests、BeautifulSoup、chardet、re、json、csv
以下先來分別介紹這幾個模塊的用處

1.request模塊

利用requests模塊我們可以獲取所要爬取網頁的html內容。使用requests.get(url)可以返回對應網頁的連接,在調用.text或者.content來獲取對應的網頁html內容。其中.text是以字符串的格式返回網頁內容,.content是以二進制字節的形式反回網頁內容,兩者有不同的用處。例如有些以.text返回的網頁內容會出現編碼格式不對導致的亂碼問題等。
代碼示例:

goods_content = requests.get(url).content

返回

<class 'bytes'>

對於.text返回<class 'str'>

爲什麼這裏用.content就是因爲在這裏調用.text時會出現漢字亂碼的問題.

2.chardet

對於網頁亂碼的問題,我們需要首先在網頁的源代碼處觀察網頁設計者編寫網站時所使用的編碼格式。第一種方式很簡單,一般在源代碼的開頭出都會給出。例如

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />

可以看出第一個網頁的編碼格式是utf-8格式的編碼,第二個頁面的編碼格式是gbk編碼,如果你在解析utf-8編碼格式的網頁時默認用了gbk的格式進行解析,那麼就會出現亂碼的問題,這時需要調用.decode()或者.encode()函數進行對應的格式變換,相應的內容可以參考Python官網Documents encodedecode
對於幾種編碼格式的資料可以參考http://blog.csdn.net/fennvde007/article/details/20769179

第二種代碼的方式就是利用chardet模塊。利用chardet的detect()函數獲取網頁的編碼格式。例如

status = chardet.detect(goods_content)      #判斷網頁的編碼格式

返回

{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

通過encoding屬性可以看出網頁的編碼格式爲utf-8模式。
所以在此處,爲解決亂碼的問題。對爬取下來的內容調用.decode(‘utf-8’)進行格式轉換

content_encode = goods_content.decode('utf-8')      #將爬取得二進制網頁內容解碼成utf-8編碼格式

3.BeautifulSoup模塊

這一塊的部分可以參考我之前寫的BeautifulSoup的幾個方法BeautifulSoup中一些函數的用法歸納
利用BeautifulSoup對網頁節點進行查找可以有兩種方法。第一種利用.運算直接查找
例如soup.a soup.title
第二種就是利用find()和find_all函數進行查找
find()函數只返回第一個所要查找的節點標籤的類型
find_all()函數以列表的形式返回所有要查找的節點標籤的類型
函數的參數可以爲所要查找的節點標籤類型,例如

p_label = soup.find_all('p')

也可以利用attrs參數來查找指定屬性的對應標籤,例如

p_label = soup.find('p', attrs = {'class':'ui-page-s'})

在爬蟲中主要就是利用BeautifulSoup返回的解析樹,根據你需要獲取的信息,對應到網頁源代碼中相應的標籤節點,利用soup.find和soup.find_all()去一層一層篩選節點,以此來獲取你需要的信息。
例如:

    #找對應的id標籤
    J_goodsList = soup.find_all('div', attrs={'id': 'J_goodsList'})[0]
    gl_i_wrap = J_goodsList.find_all('div', attrs = {'class':'gl-i-wrap'})
    for label in gl_i_wrap:
       a_label = label.a
       a_href = a_label['href']

就是首先找到屬性id爲’J_goodsList’的div節點,接下再在該節點下查找所有屬性class爲’gl-i-wrap’的div節點,對返回的div節點列表進行遍歷,遍歷的過程中只獲取div下的a標籤,在獲取a標籤的屬性值href。從而獲取對應商品的鏈接網站。

最後要指明利用這樣訪問節點的方式進行檢索不是不可以,在工程量減小的時候可以實現,但是當網頁比較複雜,節點標籤較多的時候,你很難將你需要的內容直接對應到某一個或某幾個節點,這個時候利用xPath或CSS的模式進行檢索,再利用瀏覽器的檢查(F12),兩者可以很方便的生成你想獲取信息的xPath或CSS路徑。這裏暫時不介紹這方面的知識。

4.re正則表達式模塊

正則表達式對於檢索文檔信息、對字符串內容進行檢索,特別是對於文本的處理時是十分必要且效率很高的。相關資料也很多,可以參考Python正則表達式指南
對於本文的爬蟲,利用re模塊是爲了方便的獲取對於商品的信息,獲取這些信息的原因是爲了後面在爬取評論時,對於京東評論網頁構建Query String Parameters裏的參數。這裏只貼上代碼,示例正則表達式模塊的使用,對於參數的用處放在後面再將
首先構建正則表達式

#利用正則表達式匹配頁面所需信息
re_skuId = re.compile(r'skuId=\d+')     #獲取商品的skuId值
re_https = re.compile(r'https:')        #對網站格式的處理
rex=re.compile(r'\w+[(]{1}(.*)[)]{1}')      #提取出JSON格式

應用

skuId = re_skuId.search(page_text).group()      #獲取sku的值
productId = re.search(r'\d+', skuId).group()       #獲取product的值
cont = rex.findall(t)[0]         #將爬取下來的內容轉化成可以被json解析的字典格式

5.json和csv模塊

這兩部分是格式轉換的模塊,json是爲了將對爬取下來的評論網頁解析成Python方便處理的字典格式,json有.load()和.loads(),dump()和dumps()。loads()是將json格式轉換成Python方便處理的字典格式。而dumps()方法是將Python的字典格式轉換成json格式。
csv模塊在本文的爬蟲中是爲將爬取下來的評論以csv文件的格式保存。
代碼如下:

cont = rex.findall(t)[0]         #對網頁內容進行清理,獲取json格式的部分
con = json.loads(cont)  #將爬取下來的內容轉化成可以被json解析的字典格式      
def Insert_To_Csv(csv_file, content):
    with open(csv_file, 'w') as f:
        title = ['ItemName', 'Time', 'Comment','Score',"Assess"]         #CSV文件的標題
        spamwriter = csv.writer(f, delimiter = ',')     #','分割符
        spamwriter.writerow(title)          #寫入標題
        for key, value in content.items():
            for page in value:         #先遍歷每一頁
                for comm in page:         #再遍歷每一頁下的評論
                   csv_list = comm
                   csv_list.insert(0,key)
                   spamwriter.writerow(csv_list)

相關資料可以參考官方Documents csv

這些是進行網絡爬蟲大致需要的模塊,後續還有其他比較重要的模塊再繼續進行補充,接下來再對用Python爬取京東評論的思路和方法進行介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章