任务
【Task2 正则表达式】:(1天)
学习什么是正则表达式并尝试一些正则表达式并进行匹配。
然后结合requests、re两者的内容爬取https://movie.douban.com/top250里的内容
要求抓取名次、影片名称、国家、导演等字段。
获取豆瓣电影 Top 250的URL
手工浏览后,发现十页的URL分别如下:
- 第一页:https://movie.douban.com/top250
- 第二页:https://movie.douban.com/top250?start=25&filter=
- 第三页:https://movie.douban.com/top250?start=50&filter=
- …
- 第十页:https://movie.douban.com/top250?start=225&filter=
- 根据以上的URL,猜测每个页面都是从start = xxx开始,并且filter=没什么用处,可以省略。
简单测试了一下,发现猜测是正确的:
第一页,也可以使用https://movie.douban.com/top250?start=0
每一个页面有25个电影,URL很有规律:
https://movie.douban.com/top250?start=xxx
xxx为数字,从0开始,都是25的整数倍,共10页
通过以下代码获得Top 250的url:
for i in range(10):
url = 'https://movie.douban.com/top250?start='
url += str(i * 25)
text = opoenurl(url)
print(text)
得到如下URL链接,确认点击后可以得到想要的结果:
https://movie.douban.com/top250?start=0
https://movie.douban.com/top250?start=25
https://movie.douban.com/top250?start=50
https://movie.douban.com/top250?start=75
https://movie.douban.com/top250?start=100
https://movie.douban.com/top250?start=125
https://movie.douban.com/top250?start=150
https://movie.douban.com/top250?start=175
https://movie.douban.com/top250?start=200
https://movie.douban.com/top250?start=225
获取内容,分析结果
使用以下代码,获取结果
def openurl(url):
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
try:
r = requests.get(url, headers = headers, timeout = 20)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print('无法访问网页' + url)
分别抓取页面,把结果保存到一个变量中,打印出来如下:
返回很多内容,以下抓取了两个电影,省略了其它的内容:
<ol class="grid_view">
<li>
<div class="item">
<div class="pic">
<em class="">1</em>
<a href="https://movie.douban.com/subject/1292052/">
<img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" class="">
</a>
</div>
<div class="info">
<div class="hd">
<a href="https://movie.douban.com/subject/1292052/" class="">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
1994 / 美国 / 犯罪 剧情
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.6</span>
<span property="v:best" content="10.0"></span>
<span>1338863人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>
</li>
<li>
<div class="item">
<div class="pic">
<em class="">2</em>
<a href="https://movie.douban.com/subject/1291546/">
<img width="100" alt="霸王别姬" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p1910813120.jpg" class="">
</a>
</div>
<div class="info">
<div class="hd">
<a href="https://movie.douban.com/subject/1291546/" class="">
<span class="title">霸王别姬</span>
<span class="other"> / 再见,我的妾 / Farewell My Concubine</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 陈凯歌 Kaige Chen 主演: 张国荣 Leslie Cheung / 张丰毅 Fengyi Zha...<br>
1993 / 中国大陆 香港 / 剧情 爱情 同性
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.6</span>
<span property="v:best" content="10.0"></span>
<span>989216人评价</span>
</div>
<p class="quote">
<span class="inq">风华绝代。</span>
</p>
</div>
</div>
</div>
</li>
分析返回的结果
根据网页及返回的HTML:
网页的文字:
肖申克的救赎 / The Shawshank Redemption / 月黑高飞(港) / 刺激1995(台) [可播放]
导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...
1994 / 美国 / 犯罪 剧情
9.6 1338863人评价
希望让人自由。
我们需要以下信息:
名次、影片名称、国家、导演
- 其中名次在图片的左边,对比HTML:
-
- 名次包括在以下标签中
<em class="">1</em>
- 影片名称(这里有点不太靠谱,re在这里可能会匹配到我们不想要的内容,可以使用其它方法,今后再说)
<img width="100" alt="霸王别姬" src="https
- 国家
/ 美国 /
- 导演
导演: 陈凯歌 Kaige Chen 主演
组合代码
把上述内容都组合在一起,把获取的结果放到文本文件中:
import requests
import re
def openurl(url):
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
try:
r = requests.get(url, headers = headers, timeout = 20)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print('无法访问网页' + url)
if __name__ == '__main__':
douban_250 = []
for i in range(10):
url = 'https://movie.douban.com/top250?start='
url += str(i * 25)
text = openurl(url)
ranks = re.findall('<em class="">(.*)</em>', text)
movie_names = re.findall('<img width="100" alt="(.*)" src="https', text)
counties = re.findall(' / (.*) / ',text)
directors = re.findall('导演: (.*) 主演', text)
z = zip(ranks, movie_names, counties, directors)
for i in z:
douban_250.append(i)
with open('douban250.txt', 'w') as f:
for i in douban_250:
f.writelines(str(i) + '\n')
成果如下: