时间:2021-07-01 10:21:17 帮助过:120人阅读
打开豆瓣电影排行榜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 '爬取完毕!'