访问豆瓣电影TOP250,获取每部电影的中文片名、排名、评分及其对应的链接,以及每部电影的导演、编剧、主演、类型、上映时间、片长、评分人数及剧情简介。

代码注意事项,可做适量调整

需要安装对应的包

# 爬取豆瓣电影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('**************爬取完成**************')

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值