在爬取网页时,会将图片也爬取下来,下面的代码是将每部电影的图片保存到本地:
def down_image(url,headers): r = requests.get(url,headers = headers) filename = re.search('/public/(.*?)$',url,re.S).group(1) with open(filename,'wb') as f: f.write(r.content)爬取到网页的信息后,一般会将爬取的信息保存到数据库或文本文件中,下面的代码是将爬取到的电影信息保存到文本文件中:
def write_movies_file(str): with open('douban_film.txt','a',encoding='utf-8') as f: f.write(json.dumps(str,ensure_ascii=False) + '\n')写入文本文件用到了json库的dumps方法,该方法实现了字典的序列化,并且要指定ensure_ascii参数为False,保证中文不乱码。
write_movies_file方法传入的是一个字典的参数,因此在爬取到一部电影的信息时,需要将电影信息格式化为一个字典,代码为:
results = re.findall(regix, text, re.S) for item in results: yield { '电影名称' : item[2] + ' ' + re.sub(' ','',item[3]), '导演和演员' : re.sub(' ','',item[4].strip()), '评分': star_transfor(item[6].strip()) + 'http://www.likecs.com/' + item[7] + '分', '排名' : item[0] }到目前为止,我们已经实现了爬取一页电影的信息,一页包含有25部电影,250部电影有10页,之前已经提到过,改变start的值即可抓取不同页的电影,下面的代码是构造10页电影url的代码:
for offset in range(0, 250, 25): url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='爬取豆瓣电影top250的完整代码如下:
import requests import re import json def parse_html(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"} response = requests.get(url, headers=headers) text = response.text regix = '<div>.*?<em>(.*?)</em>.*?<img.*?src="(.*?)">.*?divhd".*?class="title">(.*?)</span>.*?class="other">' \ '(.*?)</span>.*?<div>.*?<p>(.*?)<br>(.*?)</p>.*?class="star.*?<span></span>.*?' \ 'span.*?average">(.*?)</span>' results = re.findall(regix, text, re.S) for item in results: down_image(item[1],headers = headers) yield { '电影名称' : item[2] + ' ' + re.sub(' ','',item[3]), '导演和演员' : re.sub(' ','',item[4].strip()), '评分': star_transfor(item[6].strip()) + 'http://www.likecs.com/' + item[7] + '分', '排名' : item[0] } def main(): for offset in range(0, 250, 25): url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter=' for item in parse_html(url): print(item) write_movies_file(item) def write_movies_file(str): with open('douban_film.txt','a',encoding='utf-8') as f: f.write(json.dumps(str,ensure_ascii=False) + '\n') def down_image(url,headers): r = requests.get(url,headers = headers) filename = re.search('/public/(.*?)$',url,re.S).group(1) with open(filename,'wb') as f: f.write(r.content) def star_transfor(str): if str == 'rating5-t': return '五星' elif str == 'rating45-t' : return '四星半' elif str == 'rating4-t': return '四星' elif str == 'rating35-t' : return '三星半' elif str == 'rating3-t': return '三星' elif str == 'rating25-t': return '两星半' elif str == 'rating2-t': return '两星' elif str == 'rating15-t': return '一星半' elif str == 'rating1-t': return '一星' else: return '无星' if __name__ == '__main__': main()总结
使用requests爬取一个网页的基本步骤:
设置头信息。
设置代理
使用get方法爬取网页
使用正则表达式提取相应的信息