本来前几天就把豆瓣Top250的电影抓取下来了,但是一直没有时间来写博客,现在终于腾出一点时间来好好整理一下了
1.观察网页结构
首先需要登录豆瓣的网站:https://movie.douban.com/top250 ,通过审查元素,可以看到豆瓣的电影都是很整齐的放在li
里面,所以很方便我们爬取数据
通过展开第一个li
,可以看到我们需要的数据
2.观察网址的变化
通过点击页面的页数,我们发现网址也是很有规律的变化的,嘻嘻,是不是有种这个网站就是为爬虫而生的感觉
点击第二页时网址是 : https://movie.douban.com/top250?start=25&filter=
点击第三页时网址是 : https://movie.douban.com/top250?start=50&filter=
并且每一页的电影条数刚好就是25条,所以,我们可以找到规律了.当然网址的&filter
是可以去掉的,这并不会影响我们的发挥,还有一点就是通过设置start=0
依然可以访问首页
3.开始写代码了
import requests
from bs4 import BeautifulSoup
import time
import random
import pymongo
# 创建数据库
client = pymongo.MongoClient('localhost',27017)
doubantop250 = client['doubantop250']
detail = doubantop250['detail']
# 设置header
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0',
'Connection': 'keep - alive'
}
movie_list = []
def get_pages_link():
# https://movie.douban.com/top250?start=25
for item in range(0,250,25):
url = "https://movie.douban.com/top250?start={}".format(item)
web_data = requests.get(url,headers=header)
time.sleep(2)
soup = BeautifulSoup(web_data.text,'lxml')
for movie in soup.select('#wrapper li'):
href = movie.select('.hd > a')[0]['href']
name = movie.select('.hd > a > span')[0].text
star = movie.select('.rating_num')[0].text
people = movie.select('.star > span')[3].text
try:
quote = movie.select('.inq')[0].text
except :
print("没有quote哦")
quote = None
data = {
'url':href,
'评价人数':people,
'片名':name,
'评分':star,
'名言':quote
}
# 将数据插入数据库
detail.insert_one(data)
print(data)
print('\n'+' - '*50+'\n')
if __name__ =='__main__':
get_pages_link()
因为在运行的过程中,经常会报错,后来发现是在第9页有一条电影没有quote
,所以需要加上try
语句,防止中途罢工
运行完后,打开Mongo Explorer,可以看到刚好250条电影记录
4.总结
爬取豆瓣主要是想着用来练练手的,以后应该会对这些数据进行分析,但现在…..额….功力没到,只能弄个简单的实例了,希望能够对你有所启发