120行程式碼爬取豆瓣電影top250
筆者最近學習爬蟲,拿豆瓣電影進行練手,無奈豆瓣電影存在反爬機制,爬完250就會重定向要求我進行登陸操作,所以我這一次只爬取前50進行相關測試,廢話不多說,我們來看下原始碼
這次用到的還是requests庫,BeautifulSoup解析庫,和re進行輔助的正則匹配庫,最後老樣子利用pandas的DataFrame進行excel的寫入
學習Python中的小夥伴,需要學習資料的話,可以前往我的微信公眾號:速學Python,後臺回覆:簡書,即可拿Python學習資料
這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python指令碼到web開發、爬蟲、資料分析、資料視覺化、機器學習等。送給正在學習python的小夥伴!這裡是python學習者聚集地,歡迎初學和進階中的小夥伴!
import requests from bs4 import BeautifulSoup import re import pandas headers = { 'Host':'movie.douban.com', 'Origin':'movie.douban.com', 'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Mobile Safari/537.36', } base_url = 'https://movie.douban.com/top250?start={}&filter=' response = requests.get('https://movie.douban.com/top250?start=0&filter=', headers = headers) if response.status_code == 200: # print(response.text) pass pattern1 = re.compile('.*? .*? ', re.S) # 去掉所有換行符,並用正則表示式去匹配每一個頁面的具體電影 urls = re.findall(pattern1, response.text) directors = [] # 導演 names = [] # 電影名 stars = [] # 主演 countrys = [] # 電影的出產地 languages = [] # 電影語言 headers_urls = { 'Host':'movie.douban.com', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' } # 肖申克的救贖 The Shawshank Redemption # 弗蘭克·德拉邦特 # 蒂姆·羅賓斯 def base_urls(base_url): urls = [] # 這裡我們只能前兩頁做測試,所以range只設置到了50 # for i in range(0, 275, 25): # true_url = base_url.format(i) # print(true_url) for i in range(0, 50, 25): true_url = base_url.format(i) print(true_url) response = requests.get(true_url, headers=headers) if response.status_code == 200: # print(response.text) pattern1 = re.compile(' .*? .*? ',re.S) # 去掉所有換行符,並用正則表示式去匹配每一個頁面的具體電影 url = re.findall(pattern1, response.text) # 因為這裡是用findall,他返回的是一個列表,如果我們直接append,會導致列表巢狀,故我們這裡用個for迴圈提取出列表的元素再append進去 for i in url: urls.append(i) return urls def parse_url(urls): # 因為只拿前兩頁做測試,所以range設定到50 for i in range(0, 50, 1): res = requests.get(urls[i], headers = headers_urls) print(res) if res.status_code == 200: soup = BeautifulSoup(res.text, 'lxml') # 爬取電影名 name = (soup.find('span', property="v:itemreviewed")) names.append(name.text) # print(names) # 爬取導演 director = soup.find('a', rel="v:directedBy") directors.append(director.text) # print(director.text) # 爬取明星 star_save = [] for star in soup.find_all('a', rel="v:starring"): star_save.append(star.text) stars.append(star_save) # print(stars) # 爬取製片國家 #製片國家/地區: 美國
# 學到的知識點:通過匹配文字內容找下個兄弟節點 country = soup.find('span', text='製片國家/地區:').next_sibling[1:] countrys.append(country) # print(countrys) # 爬取影片語言 # 語言: language = soup.find('span', text='語言:').next_sibling[1:] languages.append(language) # print(language) # print(directors) # print(true_director) # print(a) if __name__ == '__main__': base = base_urls(base_url) print(base) print(len(base)) parse_url(base) print(countrys) print(directors) print(languages) print(names) # # 最後我們將資料寫入到一個excel表格裡 info ={'Filmname':names, 'Directors':directors, 'Country':countrys, 'Languages':languages} pdfile = pandas.DataFrame(info) # pdlook.to_excel('鏈家.xlsx', sheet_name="鏈家二手房廣州") pdfile.to_excel('DoubanFilm.xlsx', sheet_name="豆瓣電影")