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

一:爬虫

1、爬取的目标

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

2、网站结构

   基于爬虫和Kettle的豆瓣电影的采集与预处理_第1张图片

图1豆瓣网网站结构详情

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

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

基于爬虫和Kettle的豆瓣电影的采集与预处理_第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">(.*?)', html)
    type_ = '/'.join(type_)
    # 国家
    country = re.findall(r'地区: (.*?)

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

5、爬虫结果

基于爬虫和Kettle的豆瓣电影的采集与预处理_第3张图片

基于爬虫和Kettle的豆瓣电影的采集与预处理_第4张图片

预处理

1、删除列

   

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

基于爬虫和Kettle的豆瓣电影的采集与预处理_第5张图片

    

之后进行字段获取。

基于爬虫和Kettle的豆瓣电影的采集与预处理_第6张图片

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

基于爬虫和Kettle的豆瓣电影的采集与预处理_第7张图片

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

    基于爬虫和Kettle的豆瓣电影的采集与预处理_第8张图片

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

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

基于爬虫和Kettle的豆瓣电影的采集与预处理_第9张图片

三:爬虫数据源代码

代码:

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">(.*?)', html)
    type_ = '/'.join(type_)
    # 国家
    country = re.findall(r'地区: (.*?)

你可能感兴趣的:(python,python)