今天练习网络爬虫,爬取豆瓣电影Top 250,其中每部电影有排名、评分、电影名、导演等信息,分布在不同的标签下面,而每部电影的所有信息都在一个大的<div>
标签下,因此需要获取子元素的内容。查了一下只看到有人用循环嵌套的方法遍历子元素,感觉略麻烦,后来发现.contents属性可以方便地获取子元素内容,因此采用。
首先爬取第一页的内容,将所有电影的信息存入targets,用for循环遍历(使用break的目的是只研究第一部电影的信息,以节省时间):
import requests
import re
import bs4
def parse_one_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'}
res = requests.get(url, headers=headers)
soup = bs4.BeautifulSoup(res.text, 'html.parser')
targets = soup.find_all('div', class_='item')
for each in targets:
print(each)
break
def main():
global top250
top250 = []
url = 'https://movie.douban.com/top250?start={}&filter='.format(25 * 0)
parse_one_page(url)
if __name__ == '__main__':
main()
运行结果如下:
<div class="item">
<div class="pic">
<em class="">1</em>
<a href="https://movie.douban.com/subject/1292052/">
<img alt="肖申克的救赎" class="" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" width="100"/>
</a>
</div>
<div class="info">
<div class="hd">
<a class="" href="https://movie.douban.com/subject/1292052/">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>