基于爬虫和Kettle的豆瓣电影的采集与预处理

发布时间:2024年01月12日

一:爬虫

1、爬取的目标

将豆瓣电影网上的电影的基本信息,比如:电影名称、导演、电影类型、国家、上映年份、评分、评论人数爬取出来,并将爬取的结果放入csv文件中,方便存储。

2、网站结构

???

图1豆瓣网网站结构详情

此次实验爬取豆瓣网中电影页面中的电影的基本信息。

每一个电影包括电影名称、导演、电影类型、国家、上映年份、评分、评论人数。页面具体情况如图2所示。

图2豆瓣网电影基本信息详情

3、爬虫技术方案

1)、所用技术:

?????????网站解析的使用的是Xpath、数据存储使用的是csv。

2)、爬取步骤:

1、导入所需的库,如re、time、requests、lxml、random和csv。

2、定义一个名为main的函数,该函数接受两个参数:page(页码)和f(文件对象)。

3、在main函数中,构造请求URL,设置请求头,并发送GET请求以获取网页内容。

4、使用lxml库解析网页内容,提取电影详情页的链接列表和电影名称列表。

5、遍历链接列表和名称列表,对于每个链接和名称,调用get_info函数来获取电影的详细信息。

6、在get_info函数中,同样构造请求URL,设置请求头,并发送GET请求以获取电影详情页的内容。

7、使用lxml库解析电影详情页的内容,提取导演、电影类型、国家、上映时间、评分和评论人数等信息。

8、打印提取到的信息,并将其写入CSV文件中。

9、在主程序中,创建一个CSV文件,并写入表头标题。

10、使用for循环遍历10个页面,调用main函数来爬取每一页的电影信息。

11、在每次循环之间,让程序休息一段时间,以避免过于频繁的请求导致IP被封禁。

4、爬取过程:

???

1)、导入所需要的包

????

import re
from time import sleep
import requests
from lxml import etree
import random
import csv

import re:导入正则表达式模块,用于处理字符串。

from time import sleep:从time模块导入sleep函数,用于让程序暂停执行一段时间。

import requests:导入requests模块,用于发送HTTP请求。

from lxml import etree:从lxml模块导入etree函数,用于解析HTML文档。

import random:导入random模块,用于生成随机数。

import csv:导入csv模块,用于操作CSV文件。

2)、设置请求头,定义min函数接收参数,访问连接提取列表

??

def main(page, f):
    url = f'https://movie.douban.com/top250?start={page * 25}&filter='
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36', }
    resp = requests.get(url, headers=headers)
    tree = etree.HTML(resp.text)
    # 获取详情页的链接列表
    href_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/@href')
    # 获取电影名称列表
    name_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
    for url, name in zip(href_list, name_list):
        f.flush()  # 刷新文件
        try:
            get_info(url, name)  # 获取详情页的信息
        except:
            pass
        sleep(1 + random.random())  # 休息
    print(f'第{i + 1}页爬取完毕')

??

3)、使用正则表达式开始爬取网页信息

def get_info(url, name):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36',
        'Host': 'movie.douban.com',
    }
    resp = requests.get(url, headers=headers)
    html = resp.text
    tree = etree.HTML(html)
    # 导演
    dir = tree.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0]
    # 电影类型
    type_ = re.findall(r'property="v:genre">(.*?)</span>', html)
    type_ = '/'.join(type_)
    # 国家
    country = re.findall(r'地区:</span> (.*?)<br', html)[0]
    # 上映时间
    time = tree.xpath('//*[@id="content"]/h1/span[2]/text()')[0]
    time = time[1:5]
    # 评分
    rate = tree.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')[0]
    # 评论人数
    people = tree.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/div/div[2]/a/span/text()')[0]
    print(name, dir, type_, country, time, rate, people)  # 打印结果
    csvwriter.writerow((name, dir, type_, country, time, rate, people))  # 保存到文件中

4)、将爬取结果放入csv文件中

5、爬虫结果

预处理

1、删除列

???

1)、新建转换,之后使用文件输入,将csv文件输入进行处理

????

之后进行字段获取。

2)、选择转换中的字段选择进行列删除,将上映时间这个列进行删除。

2、选择转换中的增加常量,增加评论数量这一列,查询电影评论的数量这一情况。

????

  1. 最后选择文本文件输出,将处理好的数据输出,输出的格式是csv文件,分割符用逗号隔开,编码用UTF-8J进行转码,防止输出文件中有乱码。文本文件命名成姓名_处理完成_csv。

4、预处理完全处理全流程:

三:爬虫数据源代码

代码:

import re
from time import sleep
import requests
from lxml import etree
import random
import csv


def main(page, f):
    url = f'https://movie.douban.com/top250?start={page * 25}&filter='
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36', }
    resp = requests.get(url, headers=headers)
    tree = etree.HTML(resp.text)
    # 获取详情页的链接列表
    href_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/@href')
    # 获取电影名称列表
    name_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
    for url, name in zip(href_list, name_list):
        f.flush()  # 刷新文件
        try:
            get_info(url, name)  # 获取详情页的信息
        except:
            pass
        sleep(1 + random.random())  # 休息
    print(f'第{i + 1}页爬取完毕')


def get_info(url, name):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36',
        'Host': 'movie.douban.com',
    }
    resp = requests.get(url, headers=headers)
    html = resp.text
    tree = etree.HTML(html)
    # 导演
    dir = tree.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0]
    # 电影类型
    type_ = re.findall(r'property="v:genre">(.*?)</span>', html)
    type_ = '/'.join(type_)
    # 国家
    country = re.findall(r'地区:</span> (.*?)<br', html)[0]
    # 上映时间
    time = tree.xpath('//*[@id="content"]/h1/span[2]/text()')[0]
    time = time[1:5]
    # 评分
    rate = tree.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')[0]
    # 评论人数
    people = tree.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/div/div[2]/a/span/text()')[0]
    print(name, dir, type_, country, time, rate, people)  # 打印结果
    csvwriter.writerow((name, dir, type_, country, time, rate, people))  # 保存到文件中


if __name__ == '__main__':
    # 创建文件用于保存数据
    with open('03-movie-xpath.csv', 'a', encoding='utf-8', newline='')as f:
        csvwriter = csv.writer(f)
        # 写入表头标题
        csvwriter.writerow(('电影名称', '导演', '电影类型', '国家', '上映年份', '评分', '评论人数'))
        for i in range(10):  # 爬取10页
            main(i, f)  # 调用主函数
            sleep(3 + random.random())

文章来源:https://blog.csdn.net/yh1009/article/details/135524953
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。