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

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

获取电影详情页

打开https://movie.douban.com/top250? 网址,翻到最下面,打开开发者工具,随便点击翻页。会看到下图请求的URL,URL里只有start变化,每次翻页加25,到250截至。
python爬虫(一) —— 豆瓣电影TOP前250信息爬取_第1张图片
全篇提取信息全用正则表达式。
获取详情页

def get_detail_url(base_url):
    """
    :param base_url: 初始网页
    :return: 每页电影url的列表
    """
    html = requests.get(url=base_url, headers=headers).text
    url = re.findall('', 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'(\d+)', html).group(1)  # 评论人数
    picture_url = re.search('"image": "(.*?)",', html).group(1)  # 电影海报图片地址
    # 经测试,电影的简介共有两种情况,用正则提取需要判断
    try:
        summary = re.search('(.*?)', html, re.S).group(1).strip()
    except AttributeError:
        summary = re.search(' ', html, re.S).group(1).strip()
    summary = re.sub(r'\s', '', summary).replace('
'
, '') # 去掉所有空白字符,然后替换掉
# 这里返回列表,防止电影信息中存在英文状态下的逗号 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('', 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'(\d+)', html).group(1)  # 评论人数
    picture_url = re.search('"image": "(.*?)",', html).group(1)  # 电影海报图片地址
    # 经测试,电影的简介共有两种情况,用正则提取需要判断
    try:
        summary = re.search('(.*?)', html, re.S).group(1).strip()
    except AttributeError:
        summary = re.search(' ', html, re.S).group(1).strip()
    summary = re.sub(r'\s', '', summary).replace('
'
, '') # 去掉所有空白字符,然后替换掉
# 这里返回列表,防止电影信息中存在英文状态下的逗号 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]

你可能感兴趣的:(爬虫)