项目目标:
爬取豆瓣电影排行榜top250
项目分析:
打开豆瓣电影排行榜网址(以下分别是前三页的网址),由此我们判断只需更改"start=**"的数值既可遍历整个排行榜。
- https://movie.douban.com/top250?
- https://movie.douban.com/top250?start=25&filter=
- https://movie.douban.com/top250?start=50&filter=
获取网址
使用requests获取网页信息
def get_one_page(url):
try:
r = requests.get(url, headers=headers)
r.raise_for_status() #查看链接是否异常
r.encoding = r.apparent_encoding
return r.text
except:
return "爬取失败!"
解析获取到的网址
使用正则表达式,获取排名,名称,上映时间,评分这些信息。
def pare_one_page(html):
pattern = re.compile('<li>.*?class="">(\d+)</em>.*?class="title">(.*?)</span>.*?class="">.*?(\d+).'
'*?</p>.*?property="v:average">.*?(\d.\d)</span>.*?</li>', re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'排名': item[0],
'名称': item[1],
'时间': item[2],
'评分': item[3]
}
保存文件
def write_to_file(content):
with open('top250.txt', 'a', encoding='utf-8') as f: #'a'表示往后追加数据
f.write(str(content) + '\n') # content 字典改为字符串
f.close()
最后附上全部代码
'''
抓取
解析
存储
'''
import requests
import re
from multiprocessing import Pool
headers = {'user-agent':'Mozilla/5.0'}
def get_one_page(url):
try:
r = requests.get(url, headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "爬取失败!"
def pare_one_page(html):
pattern = re.compile('<li>.*?class="">(\d+)</em>.*?class="title">(.*?)</span>.*?class="">.*?(\d+).'
'*?</p>.*?property="v:average">.*?(\d.\d)</span>.*?</li>', re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'排名': item[0],
'名称': item[1],
'时间': item[2],
'评分': item[3]
}
def write_to_file(content):
with open('top250.txt', 'a', encoding='utf-8') as f: #'a'表示往后追加数据
f.write(str(content) + '\n') # content 字典改为字符串
f.close()
def main(num):
url = "https://movie.douban.com/top250?start=" + str(num) +"&filter="
html = get_one_page(url)
for item in pare_one_page(html):
print(item)
write_to_file(item)
if __name__ == "__main__":
for i in range(10):
main(i*25)
运行
查看结果
查看文件
完成!