python爬虫(一) —— 豆瓣电影TOP前250信息爬取

爬取过程虽然简单,但以学习为目的,在中间使用了一些库以及python语法的高级用法。

获取电影详情页

打开https://movie.douban.com/top250? 网址,翻到最下面,打开开发者工具,随便点击翻页。会看到下图请求的URL,URL里只有start变化,每次翻页加25,到250截至。
在这里插入图片描述
全篇提取信息全用正则表达式。
获取详情页

def get_detail_url(base_url):
    """
    :param base_url: 初始网页
    :return: 每页电影url的列表
    """
    html = requests.get(url=base_url, headers=headers).text
    url = re.findall('<a href="(.*?)" class="">', html)
    return url

提取电影信息

因为这次写入csv文件,返回数据时以列表形式

def get_film_info(film_url):
    """
    :param film_url: 每个电影的url
    :return: 电影信息的列表
    """
    html = requests.get(url=film_url, headers=headers).text
    mark = re.search('"ratingValue": "(.*?)"', html).group(1)  # 评分
    name = re.search('e="title" value="(.*?)">', html).group(1)  # 电影名
    total_mark = re.search(r'<span property="v:votes">(\d+)</span>', html).group(1)  # 评论人数
    picture_url = re.search('"image": "(.*?)",', html).group(1)  # 电影海报图片地址
    # 经测试,电影的简介共有两种情况,用正则提取需要判断
    try:
        summary = re.search('<span property="v:summary" class="">(.*?)</span>', html, re.S).group(1).strip()
    except AttributeError:
        summary = re.search(' <span class="all hidden">(.*?)</span>', html, re.S).group(1).strip()
    summary = re.sub(r'\s', '', summary).replace('<br/>', '')  # 去掉所有空白字符,然后替换掉<br/>
    # 这里返回列表,防止电影信息中存在英文状态下的逗号
    return [name, mark, total_mark, picture_url, summary]

数据保存到csv文件

写入时newline一定要设置为空,否则插入数据时每条数据之间都会有空行。

def write_to_csv(content):
    """
    :param content: 电影信息  列表
    :return: None
    """
    with open('豆瓣TOP250.csv', 'a', encoding='utf8', newline='') as f:
        print('正在写入....')
        csv_writer = csv.writer(f)
        csv_writer.writerow(content)

完整代码

import re, requests, csv


def get_detail_url(base_url):
    """
    :param base_url: 初始网页
    :return: 每页电影url的列表
    """
    html = requests.get(url=base_url, headers=headers).text
    url = re.findall('<a href="(.*?)" class="">', html)
    return url


def get_film_info(film_url):
    """
    :param film_url: 每个电影的url
    :return: 电影信息的列表
    """
    html = requests.get(url=film_url, headers=headers).text
    mark = re.search('"ratingValue": "(.*?)"', html).group(1)  # 评分
    name = re.search('e="title" value="(.*?)">', html).group(1)  # 电影名
    total_mark = re.search(r'<span property="v:votes">(\d+)</span>', html).group(1)  # 评论人数
    picture_url = re.search('"image": "(.*?)",', html).group(1)  # 电影海报图片地址
    # 经测试,电影的简介共有两种情况,用正则提取需要判断
    try:
        summary = re.search('<span property="v:summary" class="">(.*?)</span>', html, re.S).group(1).strip()
    except AttributeError:
        summary = re.search(' <span class="all hidden">(.*?)</span>', html, re.S).group(1).strip()
    summary = re.sub(r'\s', '', summary).replace('<br/>', '')  # 去掉所有空白字符,然后替换掉<br/>
    # 这里返回列表,防止电影信息中存在英文状态下的逗号
    return [name, mark, total_mark, picture_url, summary]


def write_to_csv(content: list):
    """
    :param content: 电影信息  列表
    :return: None
    """
    with open('豆瓣TOP250.csv', 'a', encoding='utf8', newline='') as f:
        print('正在写入....')
        csv_writer = csv.writer(f)
        csv_writer.writerow(content)


if __name__ == '__main__':
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                             'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', }
    for page in range(0, 251, 25):  # 循环所有检索页
        tp_url = 'https://movie.douban.com/top250?start={}&filter='.format(page)
        film_info = [get_film_info(fu) for fu in get_detail_url(tp_url)]
        [write_to_csv(info) for info in film_info]
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值