发布网友
共2个回答
懂视网
这个插件可以方便查看包括HTML在内许多内容
打开豆瓣电影排行榜top250网页,发现每页有25部电影,一共10页,其每一页url具有如下特征:
http://movie.douban.com/top250?start=0
http://movie.douban.com/top250?start=25
http://movie.douban.com/top250?start=50
http://movie.douban.com/top250?start=75
......
以此类推因此只需要利用循环对后面的0,25,...225处理即可。
网页点击任何一个电影中文名,右击鼠标“查看元素”查看HTML源代码:
可以发现电影名称放在 中,同时英文名也放在 中。
可以利用正则表达式(.*)匹配电影的中文名和英文名,但这里只想得到中文名,所以需要过滤英文名。
过滤方法可以利用find(str,pos_start,pos_end)函数实现,剔除英文名字里特有的特征:‘ ’和‘/’,详见代码。
3.代码实现
这里代码比较简单,因此就不用定义函数了。
#!/usr/bin/python # -*- coding: utf-8 -*- # import requests,sys,re from bs4 import BeautifulSoup reload(sys) sys.setdefaultencoding('utf-8') print '正在从豆瓣电影Top250抓取数据......' for page in range(10): url='https://movie.douban.com/top250?start='+str((page-1)*25) print '---------------------------正在爬取第'+str(page+1)+'页......--------------------------------' html=requests.get(url) html.raise_for_status() try: soup=BeautifulSoup(html.text,'html.parser') soup=str(soup) # 利用正则表达式需要将网页文本转换成字符串 title=re.compile(r'(.*)') names=re.findall(title,soup) for name in names: if name.find(' ')==-1 and name.find('/')==-1: # 剔除英文名(英文名特征是含有' '和'/') print name # 创建名称,评分 except Exception as e: print e print '爬取完毕!'
热心网友
#!/usr/bin/env python2.7# encoding=utf-8"""
爬取豆瓣电影TOP250 - 完整示例代码
"""import codecsimport requestsfrom bs4 import BeautifulSoup
DOWNLOAD_URL = 'http://movie.douban.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()