任務:爬取豆瓣最受歡迎的250個電影的資料
鏈接:豆瓣電影 Top 250
用瀏覽器打開后,使用F12或鼠標右鍵--檢查,查看網頁的源代碼,分析網頁結構,如下圖所示:
分析后得知:
1.電影名位于class為hd的div中,里邊嵌套中一層a標簽和span標簽,最終目的地為<span class="title"></span>?;
2.電影評分位于class_="rating_num"的span中;
3.?電影資料位于class_="bd"的div中;
參見下圖:
下面通過編寫python代碼,爬取最受歡迎250部電影的名字,評分和電影資料,并導出到movies.txt文件中, 下面簡要說下編碼實現過程:
1.導入2個第三方庫:requests用于發送請求,bs4用于將復雜的網頁代碼結構解析成可讀性強的書籍目錄索引結構;
2.headers必不可少,很多網頁都有反爬機制,使用headers能在一定程度繞開反爬機制,
3.按照上面分析出,提取出電影名,評分和電影資料,并存儲到各自的集合中;
4.找出總面數,在for循環中逐頁提取;
5.最后把所有頁碼中提取出來的信息輸出到movies.txt文件中。
import bs4
import requestsheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}def get_response(url):response = requests.get(url, headers=headers)return responsedef find_movies(response):soup = bs4.BeautifulSoup(response.text, 'html.parser')#電影名movies = []targets = soup.find_all("div", class_="hd")for target in targets:movies.append(target.a.span.text)#電影評分ranks = []targets = soup.find_all("span", class_="rating_num")for target in targets:ranks.append('評分:%s'% target.text)#電影資料messages = []targets = soup.find_all("div", class_="bd")for target in targets:try:messages.append(target.p.text.split('\n')[1].strip()+target.p.text.split('\n')[2].strip())except:continueresult = []length = len(movies)for i in range(length):result.append((movies[i]+ranks[i]+messages[i]+'\n'))return result# 找出一共有多少頁
def find_pages(response):soup = bs4.BeautifulSoup(response.text, 'html.parser')# 找到總頁數total_pages = soup.find("span", class_="next").previous_sibling.previous_sibling.textreturn int(total_pages)# 爬取所有電影
def crawl_movies():url = 'https://movie.douban.com/top250'res = get_response(url)total_pages = find_pages(res)movies = []for i in range(total_pages):page_url = url + '?start=' + str(i*25)page_res = get_response(page_url)movies.extend(find_movies(page_res))with open('movies.txt', 'w', encoding='utf-8') as f:for movie in movies:f.write(movie)if __name__ == '__main__':crawl_movies()
溫馨提示:爬蟲一定要遵守網站的robot協議,友好爬取,別把對方的網站爬崩了。