代码注意事项,可做适量调整
需要安装对应的包
# 爬取豆瓣电影TOP250数据
import urllib.request, urllib.error
from bs4 import BeautifulSoup
import re
def askURL(url):
# 访问网址,获取html
head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
request = urllib.request.Request(url, headers=head)
html = ''
try:
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
except urllib.error.URLError as e:
if hasattr(e, 'code'):
print(e.code)
if hasattr(e, 'reason'):
print(e.reason)
return html
# 然后对获取到的网页进行解析,得到我们想要的数据
def getData(baseurl):
datalist = []
for i in range(0, 10): # 调用回去页面信息的函数 · 10次
url = baseurl + str(i * 25)
html = askURL(url) # 保存获取到的网页源码
# 逐一解析数据
soup = BeautifulSoup(html, "html.parser")
# 查找符合要求的字符串,形成列表
for item in soup.find_all('div', class_='item'):
data = [] # 保存一部电影的所有信息
item = str(item)
rank = len(datalist) + 1 # 排名
data.append(str(rank))
link = re.findall(findLink, item)[0] # 链接
data.append(link)
titles = re.findall(findTitle, item)
data.append(titles[0]) # 中文片名
rating = re.findall(findRating, item)[0] # 评分
data.append(rating)
datalist.append(data) # 把处理好的一部电影信息放入datalist
for data in datalist:
movie_info = '-'.join(data) # 按照“排名-中文片名-评分-链接”的格式拼接信息
print(movie_info)
return datalist
if __name__ == '__main__':
# 定义一些正则表达式,用来匹配想要的信息
findLink = re.compile(r'<a href="(.*?)">') # 影片详细链接的规则
findTitle = re.compile(r'<span class="title">(.*?)</span>') # 影片片名的规则
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>') # 影片评分的规则
baseurl = "https://movie.douban.com/top250?start="
datalist = getData(baseurl) # 爬取网页并解析数据
在上面的基础上,获取每部电影的导演、编剧、主演、类型、上映时间、片长、评分人数及剧情简介等信息,并将获取的信息保存至本地文件。
from bs4 import BeautifulSoup
import re
import docx
from docx.oxml.ns import qn
import urllib.request, urllib.error
# 请求网页
def page_request(url, ua):
# 访问网址,获取html
head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
request = urllib.request.Request(url, headers=head)
html = ''
try:
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
except urllib.error.URLError as e:
if hasattr(e, 'code'):
print(e.code)
if hasattr(e, 'reason'):
print(e.reason)
return html
# 解析网页
def page_parse(html, ua):
soup = BeautifulSoup(html, 'lxml')
for tag in soup.find_all(attrs={'class': 'item'}):
data = []
# 序号
num = tag.find('em').get_text()
data.append(num)
# 电影名称
name = tag.find_all(attrs={'class': 'title'})[0].get_text()
data.append(name)
# 豆瓣链接
href = tag.find(attrs={'class': 'hd'}).a
url = href.attrs['href']
data.append('豆瓣链接:' + url)
# 评分与评论数
info = tag.find(attrs={'class': 'star'}).get_text()
info = info.replace('\n', '').lstrip()
# 使用正则表达式获取数字
mode = re.compile(r'\d+\.?\d')
i = 0
for n in mode.findall(info):
if i == 0:
# 评分
data.append('豆瓣评分:' + n)
elif i == 1:
# 评分人数
data.append('评分人数:' + n)
i = i + 1
# 进入子网页,获取每部电影的具体信息
sub_page_requests(url, ua, data)
print('第%s部电影信息爬取完成' % num)
# 子网页处理函数:进入并解析子网页/请求子网页
# 获取影片详细信息
def sub_page_requests(url, ua, data):
html = page_request(url=url, ua=ua)
soup = BeautifulSoup(html, 'lxml')
# 影片信息
info = soup.find(attrs={'id': 'info'}).get_text()
data.append(info)
# 影片简介
summary = soup.find(attrs={'property': 'v:summary'}).get_text()
summary = summary.replace('\n', '').replace(' ', '').lstrip()
data.append(data[1] + '影片简介:\n' + summary)
# 保存影片信息
save(data)
import os
def save(data):
# 判断文件是否已存在
file_path = 'result/' + data[0] + '、' + data[1] + '.docx'
if os.path.exists(file_path):
print(f"文件 {file_path} 已存在,跳过保存。")
return
file = docx.Document()
# 设置字体格式
file.styles['Normal'].font.name = u'Times New Roman'
file.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), u'Times New Roman')
# 将爬取到的数据写入word中
for element in data:
file.add_paragraph(element)
file.save(file_path)
if __name__ == "__main__":
print('**************开始爬取豆瓣电影**************')
ua = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4421.5 Safari/537.36'}
# 豆瓣电影Top250每页有25部电影,start就是每页电影的开头
data_List = []
for startNum in range(0, 251, 25):
url = "https://movie.douban.com/top250?start=%d" % startNum
html = page_request(url=url, ua=ua)
# 获取每部影片的信息
page_parse(html=html, ua=ua)
print('**************爬取完成**************')