Python爬取豆瓣电影排名前250名

简述

记录python爬虫读取豆瓣前250名记录过程,记录爬虫步骤,作个人记录使用。

准备工作

提取豆瓣电影TOP250电影名称,演员阵容,简介信息,提取站点URL为豆瓣电影排名,提取的结果会以文件形式保存下来。使用request库。

抓取分析

抓取的目标站点为豆瓣电影排名,打开之后可以查看榜单信息
豆瓣电影排名

排名第一的是肖申克的救赎,页面显示的有效信息为影片名称,演员阵容,上映时间,分类,简介等内容,将页面滚动最下方,发现分页列表,选择第二页,查看URL变化,豆瓣电影排名第二页
发现URL地址由https://movie.douban.com/top250?start=0变为https://movie.douban.com/top250?start=25,start从0变成25,排名从1–25到了26–50名,表示start代表偏移量,所以,想获取TOP250电影信息,需要分开请求10次,10次请求中start的值为0,25,50…初步以这样的思路去尝试。

抓取首页

首页抓取第一页的内容。实现get_one_page方法,传入url参数,将抓取的结果返回,通过main方法调用,初步代码实现:

import requests

# 页面请求
def get_one_page(url):
    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    else:
        return None
# 主函数
def main():
    url = 'https://movie.douban.com/top250?start=0'
    html = get_one_page(url)
  	print(html)

main()

运行之后,应该可以看到首页内容,获取源代码后,需要解析页面,提取我们想要的信息。

正则提取

查看其中一条的源代码,
在这里插入图片描述
一条电影信息对应的源码是一个info节点,影片描述信息处于dd节点,用正则表达式提取电影名称信息,电影名称信息在class为title的span标签内,利用非贪婪匹配,获取电影名称信息,hd.?title.?>(.*?)
同理获取电影的描述信息,演员阵容,简介内容,定义页面解析方法parse_one_page(),通过正则表达式从结果中获取想要内容

def parse_page(html):
    pattern = re.compile('hd.*?title.*?>(.*?)</span>.*?bd.*?p.*?>(.*?)<br>.*?quote.*?inq.*?>(.*?)</span>', re.S)
    items = re.findall(pattern,html)
    for item in items:
        yield {
            '电影名称': item[0],
            '简介': item[1].strip(),
            '描述': item[2].strip(),
        }
    return items

写入文件

将提取结果写入文件,通过JSON库的dumps方法实现字典的序列化,指定ensure_ascii参数为False,保证输出结果为中文

# 写入文件
def write_to_file(content):
    with open('douban.txt','a', encoding='utf-8') as f:
        print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False)+ '\n')

整合代码

最后,通过main()方法调用前面的方法,将结果写入文件,完整代码如下:

import json

import requests
import re


# 页面请求
def get_one_page(url):
    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    else:
        return None


# 获取对应元素
def parse_page(html):
    pattern = re.compile('hd.*?title.*?>(.*?)</span>.*?bd.*?p.*?>(.*?)<br>.*?quote.*?inq.*?>(.*?)</span>', re.S)
    items = re.findall(pattern,html)
    for item in items:
        yield {
            '电影名称': item[0],
            '简介': item[1].strip(),
            '描述': item[2].strip(),
        }
    return items


# 写入文件
def write_to_file(content):
    with open('douban.txt','a', encoding='utf-8') as f:
        print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False)+ '\n')


# 主函数
def main(offset):
    url = 'https://movie.douban.com/top250?start=' + str(offset)
    html = get_one_page(url)
    data = parse_page(html)
    for item in data:
        write_to_file(item)


if __name__ == '__main__':
    for i in range(10):
        main(offset=i * 25)

好的,这是一个比较复杂的任务,需要使用Python编写爬虫程序,然后使用数据解析库对爬取到的数据进行处理和分析。以下是一个基本的爬虫程序框架,你可以根据需要进行修改和完善。 ```python import requests from bs4 import BeautifulSoup url = 'https://movie.douban.com/top250' def get_html(url): headers = { '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'} try: response = requests.get(url, headers=headers) if response.status_code == 200: return response.text except requests.RequestException: return None def parse_html(html): soup = BeautifulSoup(html, 'lxml') movies = soup.select('.info') for movie in movies: title = movie.select_one('.title').text star = movie.select_one('.rating_num').text info = movie.select_one('.bd p').text brief = movie.select_one('.quote .inq').text comments = movie.select('.star span')[-1].text yield { 'title': title, 'star': star, 'info': info, 'brief': brief, 'comments': comments } def main(): for offset in range(0, 250, 25): url = 'https://movie.douban.com/top250?start={}&filter='.format(offset) html = get_html(url) for item in parse_html(html): print(item) if __name__ == '__main__': main() ``` 这个程序会爬取豆瓣电影排行250电影信息,包括电影称、明星、电影信息、电影简述、电影评论人数等。你可以根据需要对数据进行进一步处理和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值