准备工作:
1、观察要网址的结构
https://movie.douban.com/top250?start=0&filter=:?问号后面的参数,start代表页码,每页展示25部电影,0代表第一页,以此类推25代表第二页,50代表第三页…
filter顾名思义,是过滤已经看过的电影,在这里不重要,可以不管。
2、分析网页源代码
打开上面的网址,查看源代码
<ol class="grid_view">
<li>
<div class="item">
<div class="pic">
<em class="">1</em>
<a href="https://movie.douban.com/subject/1292052/">
<img alt="肖申克的救赎" src="./豆瓣电影 Top 250_files/p480747492.webp" class="">
</a>
</div>
<div class="info">
<div class="hd">
<a href="https://movie.douban.com/subject/1292052/" class="">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
1994 / 美国 / 犯罪 剧情
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.6</span>
<span property="v:best" content="10.0"></span>
<span>891851人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>
</li>
<em class="">1</em>
代表排名,<span class="title">
肖申克的救赎,代表电影名,
提取信息:电影名、排名、导演、评分、评语
第一步:爬取网页
def get_html(web_url): # 爬虫获取网页
header = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36"}
html = requests.get(url=web_url, headers=header).text#不加text返回的是response,加了返回的是字符串
Soup = BeautifulSoup(html, "lxml")
data = Soup.find("ol").find_all("li")
return data
第二步:提取有用的信息
这里提取信息,用的是模块BeautifulSoup
for info in all_move:
# 排名
nums = re.findall(r'<em class="">\d+</em>', str(info), re.S | re.M)
nums = re.findall(r'\d+', str(nums), re.S | re.M)
num = nums[0]
# 名字
names = info.find("span")
name = names.get_text()
# 导演
charactors = info.find("p")
charactor = charactors.get_text().replace(" ", "").replace("\n", "")
charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
"\xf4", "").replace("\xfb", "").replace("\u2027", "")
# 评语
remarks = info.find_all("span", {"class": "inq"})
if remarks: # 这个判断是因为有的电影没有评语,你需要做判断
remark = remarks[0].get_text().replace("\u22ef", "")
else:
remark = "此影片没有评价"
print(remarks)
# 评分
scores = info.find_all("span", {"class": "rating_num"})
score = scores[0].get_text()
第三步:保存信息
f = open("F:\\Pythontest1\\douban.txt", "a")
for info in all_move:
'''
注意这里省略了提取信息,
提取信息后,写入文件
'''
f.write(num + '、')
f.write(name + "\n")
f.write(charactor + "\n")
f.write(remark + "\n")
f.write(score).f.write("\n\n")
f.close() # 记得关闭文件
爬取的结果,如图:
最后附上代码:
from bs4 import BeautifulSoup
import pymysql
import requests
import re
import os
def get_html(web_url): # 爬虫获取网页
header = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36"}
html = requests.get(url=web_url, headers=header).text#不加text返回的是response,加了返回的是字符串
Soup = BeautifulSoup(html, "lxml")
data = Soup.find("ol").find_all("li")
return data
def get_info(all_move):
f = open("F:\\Pythontest1\\douban.txt", "a")
for info in all_move:
# 排名
nums = re.findall(r'<em class="">\d+</em>', str(info), re.S | re.M)
nums = re.findall(r'\d+', str(nums), re.S | re.M)
num = nums[0]
# 名字
names = info.find("span")
name = names.get_text()
# 导演
charactors = info.find("p")
charactor = charactors.get_text().replace(" ", "").replace("\n", "")
charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
"\xf4", "").replace("\xfb", "").replace("\u2027", "")
# 评语
remarks = info.find_all("span", {"class": "inq"})
if remarks: # 这个判断是因为有的电影没有评语,你需要做判断
remark = remarks[0].get_text().replace("\u22ef", "")
else:
remark = "此影片没有评价"
print(remarks)
# 评分
scores = info.find_all("span", {"class": "rating_num"})
score = scores[0].get_text()
f.write(num + '、')
f.write(name + "\n")
f.write(charactor + "\n")
f.write(remark + "\n")
f.write(score)
f.write("\n\n")
f.close() # 记得关闭文件
if __name__ == "__main__":
if os.path.exists("F:\\Pythontest1") == False: # 两个if来判断是否文件路径存在 新建文件夹 删除文件
os.mkdir("F:\\Pythontest1")
if os.path.exists("F:\\Pythontest1\\douban.txt") == True:
os.remove("F:\\Pythontest1\\douban.txt")
page = 0 # 初始化页数,TOP一共有250部 每页25部
while page <= 225:
web_url = "https://movie.douban.com/top250?start=%s&filter=" % page
all_move = get_html(web_url) # 返回每一页的网页
get_info(all_move) # 匹配对应信息存入本地
page += 25