爬取豆瓣電影排行(T250)的資訊
阿新 • • 發佈:2019-01-24
1.分析
針對所爬去的Url進行分析:
分析網址'?'符號後的引數,第一個引數'start=0',這個代表頁數,‘=0’時代表第一頁,‘=25’代表第二頁,以此類推。
1.1頁面分析
明確要爬取的元素 :排名、名字、導演、評語、評分
1.2 頁面程式碼分析
2.網站資訊爬取
2.1 獲取每部分電影資訊
def get_html(web_url): header = { "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"} html = requests.get(url=web_url,headers= header).text soup = BeautifulSoup(html,'lxml') data = soup.find('ol').find_all('li') #擷取需要的內容 return data
【程式碼說明】
requests.get()函式,會根據引數中url的連結,返回response物件
.text會將response物件轉換成str型別
find_all()函式,會將html文字中的ol標籤下的每一個li標籤中的內容篩選出來
2.2 篩選資訊儲存進入文字
def get_info(all_move): f = open("./douban.txt", "a",encoding='UTF-8') for info in all_move: #排名 nums = info.find('em') num = nums.get_text() #名字 names = info.find("span") # 名字比較簡單 直接獲取第一個span就是 name = names.get_text() #導演 charactors = info.find("p") # 這段資訊中有太多非法符號你需要替換掉 charactor = charactors.get_text().replace(" ", "").replace("\n", "") # 使資訊排列規律 charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace( "\xf4", "").replace("\xfb", "").replace("\u2027", "").replace("\xe5", "") #評語 remarks = info.find_all("span", {"class": "inq"}) if remarks: # 這個判斷是因為有的電影沒有評語,你需要做判斷 remark = remarks[0].get_text().replace("\u22ef", "") else: remark = "此影片沒有評價" print(remarks) #評分 scores = info.find_all("span", {"class": "rating_num"}) score = scores[0].get_text() f.write(num + '、') f.write(name + "\n") f.write(charactor + "\n") f.write(remark + "\n") # f.write(score) f.write("\n\n") f.close() # 記得關閉檔案
注意爬取元素的時候,會有非法符號(因為這些符號的存在,會影響你寫入文字中),所以需要將符號用replace函式替換.
【Tips】注意寫資料時將格式改為“UTF-8”,不然所寫資訊為亂碼
3.全部程式碼(如下)
#coding:utf-8 from bs4 import BeautifulSoup import requests import os def get_html(web_url): header = { "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"} html = requests.get(url=web_url,headers= header).text soup = BeautifulSoup(html,'lxml') data = soup.find('ol').find_all('li') #擷取需要的內容 return data def get_info(all_move): f = open("./douban.txt", "a",encoding='UTF-8') for info in all_move: #排名 nums = info.find('em') num = nums.get_text() #名字 names = info.find("span") # 名字比較簡單 直接獲取第一個span就是 name = names.get_text() #導演 charactors = info.find("p") # 這段資訊中有太多非法符號你需要替換掉 charactor = charactors.get_text().replace(" ", "").replace("\n", "") # 使資訊排列規律 charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace( "\xf4", "").replace("\xfb", "").replace("\u2027", "").replace("\xe5", "") #評語 remarks = info.find_all("span", {"class": "inq"}) if remarks: # 這個判斷是因為有的電影沒有評語,你需要做判斷 remark = remarks[0].get_text().replace("\u22ef", "") else: remark = "此影片沒有評價" print(remarks) #評分 scores = info.find_all("span", {"class": "rating_num"}) score = scores[0].get_text() f.write(num + '、') f.write(name + "\n") f.write(charactor + "\n") f.write(remark + "\n") # f.write(score) f.write("\n\n") f.close() # 記得關閉檔案 if __name__ == "__main__": File_Path = os.getcwd()[:-4] + 'Test\\' # 獲取到當前檔案的目錄,並檢查是否有report資料夾,如果不存在則自動新建report檔案 if not os.path.exists(File_Path): os.makedirs(File_Path) page = 0 # 初始化頁數,TOP一共有250部 每頁25部 while page <= 225: web_url = "https://movie.douban.com/top250?start=%s&filter=" % page all_move = get_html(web_url) # 返回每一頁的網頁 get_info(all_move) # 匹配對應資訊存入本地 page += 25
【結果展示】
Wimb