阅读文本大概需要 6 分钟。
对于一个 Python 初学者来说,最有吸引力的莫过于 Python 爬虫了,今天我们就用 Python 来写一个爬虫,爬取豆瓣电影排行 TOP 250 的电影。
先来看一下我爬到的数据:
一共 250 条,包括电影的排名、链接、图片链接、类型、评分、介绍等等。
话不多少, 下面就来实现这个功能。
首先引包:
importrequests
importre
importjson
requests 发送请求,re 正则来提取数据,json 模块将拿到的数据转成 JSON。
首先分析路由:
在切换页面的时候路由中只有 start 参数在变化,并且每次增加 25 。
然后我们根据这个规律来写爬虫。
我们先将爬虫的各个部分写好, 然后在主函数中调用爬虫的各个部分来完成。
首先我们定义一个方法获取页面:
defget_one_page(url):
headers = {
'User-Agent':'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Mobile Safari/537.36',
}
res = requests.get(url, headers=headers, verify=False)
ifres.status_code ==200:
returnres.text
else:
returnNone
这个方法传入一个 url 并根据这个 url 获取这个页面的 html 字符串,如果成功的返回 这个字符串。
接下来定义处理这个字符串的方法:
defdeal_page_data(html):
# (.*?) 匹配slogn,因部分影片没有slogn,因此更新
movie_re = re.compile(r'
.*?(.*?).*?.*?.*?
.*?([0-9]).*?;.*?;(.*?)&.*?;.*?;(.*?)\n.*?(.*?).*?
(.*?)
',re.S)
movieData = re.findall(movie_re, html )
foriteminmovieData:
ifitem[8].strip() =='':
slogn =''
else:
tmp = re.findall(r'(.*?)', item[8])
slogn = tmp[]
yield{
'index':item[],
'addr':item[1],
'title':item[2],
'image':item[3],
'time':item[4],
'area':item[5],
'class':item[6],
'score':item[7],
'slogn': slogn
}
这个方法通过正则提取数据,需要注意的一点是,有的电影是没有简介的,如果忽略这一点,而且正则不能识别的话,很可能会少爬几个电影,或者部分电影数据是错误的。
上面代码的注释中是我一开始匹配简介的方法,没有考虑到没有简介的情况,会丢失几条数据,因此更新了一下。正则中一共九个括号,每个电影获取九条数据,分别是排名、链接、名字、图片链接、上映时间、地区、类型、评分和简介。如果没有简介的 slogn 为空。
接下来就该讲数据写入文件了:
defwrite_to_file(moviedata):
withopen('doubanMovieTop250.json','a',encoding='utf-8')asf:
print('正在写入: 第 '+moviedata['index'] +' 条')
f.write(json.dumps(moviedata, ensure_ascii=False)+'\n')
这个方法是将一个电影的数据写入文件,并且换行。
接下来定义主方法调用以上这些方法实现爬虫:
defmain():
foriinrange(10):
start = str(i *25)
print('-'*30)
print('正在爬取: 第 '+ str(i+1) +' 页')
url = R'https://movie.douban.com/top250?start={}'.format(start)
html = get_one_page(url)
foritemindeal_page_data(html):
write_to_file(item)
这里通过循环实现切换页面,用循环将每一条数据写入文件,并且打印一些提示 信息。
最后启动主函数:
main()
我们的爬虫就开始运行了。
一共两百五十条数据:
大功告成。
运行的时候可能有些同学会报一个警告,可以引入一个包来暂时屏蔽这个警告:
importwarnings
warnings.filterwarnings("ignore")
到这里爬取豆瓣电影 TOP250 就完成啦。
领取专属 10元无门槛券
私享最新 技术干货