1. Python抓取豆瓣电影排行榜
1.观察url
首先观察一下网址的结构 http://movie.douban.com/top250?start=0&filter=&type= :
可以看到,问号?后有三个参数 start、filter、type,其中start代表页码,每页展示25部电影,0代表第一页,以此类推25代表第二页,50代表第三页...
filter顾名思义,是过滤已经看过的电影,filter和type在这里不重要,可以不管。
2.查看网页源代码
打开上面的网址,查看源代码,可以看到信息的展示结构如下:
1 2 3 4 5 1 6 7 8 9 10 11 12 13 肖申克的救赎14 / The Shawshank Redemption15 / 月黑高飞(港) / 刺激1995(台)16 17 18 19 [可播放]20 21 22 23 导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...24 1994 / 美国 / 犯罪 剧情25 26 27 28 29 9.630 646374人评价31 32 33 34 希望让人自由。35 36 37 38 39
其中1代表排名,肖申克的救赎代表电影名,其他信息的含义也很容易能看出来。
于是接下来可以写正则表达式:
1 pattern = re.compile(u'.*?.*?' 2 + u'(.*?).*?' 3 + u'.*?(.*?)' 4 + u'.*?(.*?).*?' 5 + u'(.*?).*?.*?' 6 + u'.*?.*?' 7 + u'导演: (.*?) ' 8 + u'主演: (.*?)' 9 + u'(.*?) / (.*?) / '10 + u'(.*?)'11 + u'.*?.*?(.*?)'12 + u'.*?(.*?)人评价.*?.*?'13 + u'(.*?).*?', re.S)
在此处flag参数re.S代表多行匹配。
3.使用面向对象的设计模式编码
代码如下:
1 # -*- coding:utf-8 -*- 2 __author__ = 'Jz' 3 import urllib2 4 import re 5 import sys 6 7 class MovieTop250: 8 def __init__(self): 9 #设置默认编码格式为utf-810 reload(sys)11 sys.setdefaultencoding('utf-8')12 self.start = 013 self.param = '&filter=&type='14 self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'}15 self.movieList = []16 self.filePath = 'D:/coding_file/python_file/File/DoubanTop250.txt'17 18 def getPage(self):19 try:20 URL = 'http://movie.douban.com/top250?start=' + str(self.start)21 request = urllib2.Request(url = URL, headers = self.headers)22 response = urllib2.urlopen(request)23 page = response.read().decode('utf-8')24 pageNum = (self.start + 25)/2525 print '正在抓取第' + str(pageNum) + '页数据...' 26 self.start += 2527 return page28 except urllib2.URLError, e:29 if hasattr(e, 'reason'):30 print '抓取失败,具体原因:', e.reason31 32 def getMovie(self):33 pattern = re.compile(u'.*?.*?'34 + u'(.*?).*?'35 + u'.*?(.*?)'36 + u'.*?(.*?).*?'37 + u'(.*?).*?.*?'38 + u'.*?.*?'39 + u'导演: (.*?) '40 + u'主演: (.*?)'41 + u'(.*?) / (.*?) / '42 + u'(.*?)'43 + u'.*?.*?(.*?)'44 + u'.*?(.*?)人评价.*?.*?'45 + u'(.*?).*?', re.S)46 while self.start <= 225:47 page = self.getPage()48 movies = re.findall(pattern, page)49 for movie in movies:50 self.movieList.append([movie[0], movie[1], movie[2].lstrip(' / '),
51 movie[3].lstrip(' / '), movie[4],
52 movie[5], movie[6].lstrip(), movie[7], movie[8].rstrip(),53 movie[9], movie[10], movie[11]])54 55 def writeTxt(self):56 fileTop250 = open(self.filePath, 'w')57 try:58 for movie in self.movieList:59 fileTop250.write('电影排名:' + movie[0] + '\r\n')60 fileTop250.write('电影名称:' + movie[1] + '\r\n')61 fileTop250.write('外文名称:' + movie[2] + '\r\n')62 fileTop250.write('电影别名:' + movie[3] + '\r\n')63 fileTop250.write('导演姓名:' + movie[4] + '\r\n')64 fileTop250.write('参与主演:' + movie[5] + '\r\n')65 fileTop250.write('上映年份:' + movie[6] + '\r\n')66 fileTop250.write('制作国家/地区:' + movie[7] + '\r\n')67 fileTop250.write('电影类别:' + movie[8] + '\r\n')68 fileTop250.write('电影评分:' + movie[9] + '\r\n')69 fileTop250.write('参评人数:' + movie[10] + '\r\n')70 fileTop250.write('简短影评:' + movie[11] + '\r\n\r\n')71 print '文件写入成功...'72 finally:73 fileTop250.close()74 75 def main(self):76 print '正在从豆瓣电影Top250抓取数据...'77 self.getMovie()78 self.writeTxt()79 print '抓取完毕...'80 81 DouBanSpider = MovieTop250()82 DouBanSpider.main()
代码比较简单,最后将信息写入一个文件,没有什么需要解释的地方。
2. 用python3爬豆瓣电影第一页的电影名称、时长、评分
百度知道上怎么可能有人回答这种小白的问题,你如果这样根本学不会编程的,学编程最重要的是学会利用搜索引擎而不是问别人,很多你碰到过的问题都是前人碰过的了,我敢说你到百度搜一下你这个问题博客文章不下10篇,既不想看,怎么可能学会呢,不用指望有人回答这个问题了
3. 求一份Python爬取豆瓣影评数据集,多部电影,多影评的,哎
这种类型的
4. 怎样用python爬取豆瓣电影
在开发者工具中观察到该请求的Status Code是302,Response Headers中Location是该预告片的真正地址(该地址是时间的函数,不唯一!
但测试表明不同时间生成的不同的地址都能下载该预告片!
5. Python爬虫如何抓取豆瓣影评中的所有数据?
你可以用前嗅爬虫采集豆瓣的影评,我之前用的,还可以过滤只采集评分在6分以上的所有影评,非常强大,而且他们软件跟数据库对接,采集完数据后,直接入库,导出excel表。很省心。
6. python怎么爬豆瓣top250电影beautifulsoup
这不是报错 这是代码不兼容产生的 警告提示换一下写法就可以了#bsObj = BeautifulSoup(html)bsObj = BeautifulSoup(html, "lxml")
7. 如何用Python在豆瓣中获取自己喜欢的TOP N
8. python怎么抓取豆瓣电影url
#!/usr/bin/env python2.7# encoding=utf-8"""
爬取豆瓣电影TOP250 - 完整示例代码
"""import codecsimport requestsfrom bs4 import BeautifulSoup
DOWNLOAD_URL = 'httn.com/top250/'def download_page(url):
return requests.get(url, headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
}).contentdef parse_html(html):
soup = BeautifulSoup(html)
movie_list_soup = soup.find('ol', attrs={'class': 'grid_view'})
movie_name_list = [] for movie_li in movie_list_soup.find_all('li'):
detail = movie_li.find('div', attrs={'class': 'hd'})
movie_name = detail.find('span', attrs={'class': 'title'}).getText()
movie_name_list.append(movie_name)
next_page = soup.find('span', attrs={'class': 'next'}).find('a') if next_page: return movie_name_list, DOWNLOAD_URL + next_page['href'] return movie_name_list, Nonedef main():
url = DOWNLOAD_URL with codecs.open('movies', 'wb', encoding='utf-8') as fp: while url:
html = download_page(url)
movies, url = parse_html(html)
fp.write(u'{movies}\n'.format(movies='\n'.join(movies)))if __name__ == '__main__':
main()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
简单说明下,在目录下会生成一个文档存放电影名。python2