利用python2.7抓取豆瓣電影top250
1.任務說明
- 抓取top100電影名稱
- 依次打印輸出
2.網頁解析
- 要進行網絡爬蟲,利用工具(如瀏覽器)查看網頁HTML文件的相關內容是很有必要,我使用的是Firefox瀏覽器,並安裝了Firebug插件,
這個插件可以方便查看包括HTML在內許多內容
打開豆瓣電影排行榜top250網頁,發現每頁有25部電影,一共10頁,其每一頁url具有如下特征:
......
以此類推因此只需要利用循環對后面的0,25,...225處理即可。
- 網頁點擊任何一個電影中文名,右擊鼠標“查看元素”查看HTML源代碼:
可以發現電影名稱放在<span class="title"> </span>中,同時英文名也放在<span class="title"> </span>中。
可以利用正則表達式<span class="title">(.*)</span>匹配電影的中文名和英文名,但這里只想得到中文名,所以需要過濾英文名。
過濾方法可以利用find(str,pos_start,pos_end)函數實現,剔除英文名字里特有的特征:‘ ’和‘/’,詳見代碼。
3.代碼實現
這里代碼比較簡單,因此就不用定義函數了。
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- # 3 import requests,sys,re 4 from bs4 import BeautifulSoup 5 6 reload(sys) 7 sys.setdefaultencoding('utf-8') 8 print '正在從豆瓣電影Top250抓取數據......' 9 10 for page in range(10): 11 url='https://movie.douban.com/top250?start='+str((page-1)*25) 12 print '---------------------------正在爬取第'+str(page+1)+'頁......--------------------------------' 13 html=requests.get(url) 14 html.raise_for_status() 15 try: 16 soup=BeautifulSoup(html.text,'html.parser') 17 soup=str(soup) # 利用正則表達式需要將網頁文本轉換成字符串 18 title=re.compile(r'<span class="title">(.*)</span>') 19 names=re.findall(title,soup) 20 for name in names: 21 if name.find('/')==-1: # 剔除英文名(英文名特征是含有'/') 22 print name 23 except Exception as e: 24 print e 25 print '爬取完畢!'
由於水平有限,難免存在不足,歡迎大家斧正!