欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

使用python,爬取網頁評論

系統 1808 0

使用python,爬取網頁評論(實例:豆瓣《都挺好》)

python的第三方庫豐富了python的功能,今天就用python的第三方庫requests和bs4這兩個庫來實現對一個網頁的爬取

操作環境

python3.7.2
requests庫
bs4庫

requests庫和bs4庫下載

如果你的電腦只用python3的版本使用以下方式下載:

pip install requests
pip install bs4

如果你的電腦中python3和python2的版本都存在:

python3 -m pip install
python2 -m pip install

這一步是最基本的,如果沒有安裝成功請先自行百度解決。

目標網站:

https://book.douban.com/subject/20492971/comments/hot

先查看網絡源代碼,觀察網頁源代碼的結構和我們要爬取的內容,這次我們要爬取的是用戶名、用戶評論、有用數,評論的星數和日期。
通過觀察我們發現我們所需的內容主要出現在這一部分:

            
              
                
                  Sofia
                
                
                
                
                  2013-06-30
                
              
              

《都挺好》=《回家》。強勢母親帶來的家庭矛盾: 懦弱的兒子+強勢的女兒。 縱容的寵愛是一種慢性毒藥,慢慢侵蝕人的奮斗、拼搏精神和生存能力。 “窮養”的女兒被逼著成長,凌厲干練, 卻失去了愛的能力——無論是愛人還是愛己。父母之愛要的就是一個平衡的點。

所以下一步就是如何將其爬取出來

爬取過程

將目標網頁的所有內容爬取下來,再進行下一步的篩選

            
              def getHTMLText(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()
        r.enconding = "utf-8"
        return r.text
    except:
        return ""

            
          

現在我們要觀察我們要爬去的內容具體在什么位置
soup.find_all()函數可以實現篩選的目的;
我們可以看到我們要的主要內容都在標簽span class="comment-info“
使用soup.find_all(“span”, ‘comment-info’)來篩選:

            
              def fillBookdata(Bookdata,html):
    soup = BeautifulSoup(html, 'html.parser')
    commmentinfo = soup.find_all("span", 'comment-info') 
    pattern = re.compile('user-stars allstar(\d+) rating')
    p = re.findall(pattern, str(commmentinfo))
    comments = soup.find_all('span', 'short')
    for i in range(len(commmentinfo)):
        Bookdata.append([commmentinfo[i].a.string, comments[i].string, p[i]])

            
          

這里使用了正則表達式需要使用re庫
正則表達式的使用可以參考別的文章,在此不做介紹。
現在寫一個輸出函數來顯示我們的爬取結果

            
              def printList(Bookdata,num):
    for i in range(num):
        u = Bookdata[i]
        print("序號:{}\n用戶名:{}\n評論內容:{}\n評分:{}星\n".format(i + 1,u[0], u[1],int(int(u[2])/10)))

            
          

運行結果如下:
使用python,爬取網頁評論_第1張圖片
使用python,爬取網頁評論_第2張圖片
與我們的爬取結果最比較可以發現我們目前爬取的內容都是正確的。
但這個只是第一頁的內容如果我們要連續的爬取呢?
通過觀察我們可以發現連續的網頁存在一定的規律:
這是第一頁https://book.douban.com/subject/20492971/comments/hot
這是第二頁https://book.douban.com/subject/20492971/comments/hot?p=2
這是第三頁https://book.douban.com/subject/20492971/comments/hot?p=3
由此我們可以改變輸出函數即可:

            
              for i in range(3):
    print('第',i+1,'頁')
    main('https://book.douban.com/subject/20492971/comments/hot?p='+str(i+1))

            
          

在運行一下:
使用python,爬取網頁評論_第3張圖片
第二頁出錯了!!!為什么呢?
具體錯誤:

            
              Traceback (most recent call last):
  File "E:\pythonwork\4-3-1.py", line 62, in 
              
                
    main('https://book.douban.com/subject/20492971/comments/hot?p='+str(i+1))
  File "E:\pythonwork\4-3-1.py", line 53, in main
    fillBookdata(uinfo1,html)
  File "E:\pythonwork\4-3-1.py", line 38, in fillBookdata
    Bookdata.append([commmentinfo[i].a.string, comments[i].string, p[i]])
IndexError: list index out of range

              
            
          

再百度完錯誤后,我們查看一下第二頁的源代碼,我們可以發現不是所用的用戶都給了星數:
使用python,爬取網頁評論_第4張圖片
下面的用戶就沒有給出評價,所以儲存星數的列表的內容并沒有達到20個,也就是后面的星數為空,所以彈出來錯誤;這個問題目前我還沒有很好的解決方式,希望各位小主獻計獻策。
以下是我的不完美的解決方式:

            
              def fillBookdata(Bookdata,html):
    soup = BeautifulSoup(html, 'html.parser')
    commmentinfo = soup.find_all("span", 'comment-info')
    
    pattern = re.compile('user-stars allstar(\d+) rating')
    p = re.findall(pattern, str(commmentinfo))
    comments = soup.find_all('span', 'short')
    for i in range(len(commmentinfo)):
        #設置異常處理機制,發現空值的情況人為的給其加一個值0
        try:
            Bookdata.append([commmentinfo[i].a.string, comments[i].string, p[i]])
        except IndexError:
            #添加一個0值
            Bookdata.append([commmentinfo[i].a.string, comments[i].string, '0'])
            #pass

            
          

但這樣的添加方式不好,不能正確的匹配到了沒有給星數的用戶。如果有更完美的方式我會在后續的文章中發布。
附上現在的代碼:

            
              import requests
from bs4 import BeautifulSoup
import bs4
import re

def getHTMLText(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()
        r.enconding = "utf-8"
        return r.text
    except:
        return ""


def fillBookdata(Bookdata,html):
    soup = BeautifulSoup(html, 'html.parser')
    commmentinfo = soup.find_all("span", 'comment-info')
    
    pattern = re.compile('user-stars allstar(\d+) rating')
    p = re.findall(pattern, str(commmentinfo))
    comments = soup.find_all('span', 'short')
    for i in range(len(commmentinfo)):
        #設置異常處理機制,發現空值的情況人為的給其加一個值0
        try:
            Bookdata.append([commmentinfo[i].a.string, comments[i].string, p[i]])
        except IndexError:
            #添加一個0值
            Bookdata.append([commmentinfo[i].a.string, comments[i].string, '0'])
            #pass
'''

def fillBookdata(Bookdata,html):
    soup = BeautifulSoup(html, 'html.parser')
    commmentinfo = soup.find_all("span", 'comment-info') 
    pattern = re.compile('user-stars allstar(\d+) rating')
    p = re.findall(pattern, str(commmentinfo))
    comments = soup.find_all('span', 'short')
    for i in range(len(commmentinfo)):
        Bookdata.append([commmentinfo[i].a.string, comments[i].string, p[i]])
'''        

def printList(Bookdata,num):
    for i in range(num):
        u = Bookdata[i]
        print("序號:{}\n用戶名:{}\n評論內容:{}\n評分:{}星\n".format(i + 1,u[0], u[1],int(int(u[2])/10)))


def main(url):
    uinfo1 = []
    '''
    url = 'https://book.douban.com/subject/20492971/comments/hot'
    '''
    html = getHTMLText(url)
    fillBookdata(uinfo1,html)
    printList(uinfo1,20)
'''   
main('https://book.douban.com/subject/20492971/comments/hot')


'''
for i in range(3):
    print('第',i+1,'頁')
    main('https://book.douban.com/subject/20492971/comments/hot?p='+str(i+1))

            
          

當然我們還有發布時間和有用數未實現,這兩個都可以通過使用正則表達式來實現(有機會各位小主可以認真學習一下正則表達式)

            
              pattern1=re.compile('>(\d+)<')
#匹配時間的正則表達式
pattern2 = re.compile('>(\d{4}-\d{1,2}-\d{1,2})<')

            
          

修改一下輸出函數即可實現一下的效果:
使用python,爬取網頁評論_第5張圖片
如有不足,還望見諒。希望各位小主給出更好的建議。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久久国产视频 | 日韩欧美三区 | 狠狠色噜噜狠狠狠狠色吗综合 | 国产成人免费 | 午夜爽爽性刺激一区二区视频 | 日韩精品久久久久久 | 五月久久婷婷综合片丁香花 | 男女男精品视频免费观看 | 色婷婷综合网 | 亚洲视频天堂 | 一二区 | 国产精品字幕 | 久久久久久久久久久9精品视频 | 久久亚洲欧美日韩精品专区 | 中国明星一级毛片免费 | 亚洲欧美中文日韩在线v日本 | 色偷偷综合 | 久久精品性视频 | 99热久久精品免费精品 | av在线电影网站 | 国产午夜精品一区二区三区在线观看 | 国产精品自线在线播放 | 欧美日本一道高清二区三区 | 日韩欧美一区二区三区四区 | 久久精品国产第一区二区 | 国产一区二区三区久久久久久久久 | 亚洲欧美中文日韩二区一区 | www午夜视频 | 成人福利 | 午夜影院毛片 | 成人自拍偷拍视频 | 日本亚洲天堂网 | www.色黄 | 天天爽天天草 | 久草在线观看福利视频 | 色综合天天天天做夜夜夜夜做 | 91精品久久久久久久久久 | 四季久久免费一区二区三区四区 | 久久婷婷色一区二区三区 | 91成人精品 | 亚洲精品66 |