《小白爬虫之豆瓣》

目录

前言

一、爬虫是什么?

二、爬虫的主要功能

 三、实践

1.简介

 2.所需库(如果安装失败,可以选择去Settings里去手动安装)



前言

新手小白如何成功实现第一次爬虫,从0到1。豆瓣作为必爬之路

一、爬虫是什么?

爬虫(Web Crawler),也称为网络爬虫、网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种自动化程序,用于在互联网上自动抓取、分析和收集数据。它们按照预定的规则或算法,遍历网页上的链接,从一个页面跳转到另一个页面,收集并存储所需的信息。

二、爬虫的主要功能

  1. 数据收集:爬虫可以收集网页上的文本、图片、视频、链接等各种类型的数据。

  2. 搜索引擎索引:搜索引擎使用爬虫来发现和索引互联网上的新网页,以便用户能够通过搜索查询找到这些网页。

  3. 数据挖掘:企业和研究机构利用爬虫从大量网页中提取有价值的信息,用于市场分析、竞争情报、价格监测等。

  4. 内容聚合:一些网站和应用程序使用爬虫来聚合来自不同来源的内容,如新闻聚合网站、社交媒体聚合应用等。

  5. 网站监控:网站管理员可以使用爬虫来监控网站的状态、性能以及内容的变化。

  6. 发送请求:爬虫向目标网站发送HTTP请求,请求访问网页。

  7. 接收响应:目标网站接收到请求后,返回网页的HTML代码或其他格式的数据。

  8. 解析网页:爬虫使用解析器(如BeautifulSoup、lxml等)来解析网页内容,提取所需的数据。

  9. 存储数据:提取的数据被存储到数据库、文件或其他存储介质中。

  10. 遍历链接:爬虫从当前网页中提取出其他链接,并重复上述过程,直到满足停止条件(如达到预设的抓取深度、时间限制或抓取到足够的数据)。

 三、实践

1.简介

目标网站: https://movie.douban.com/top250
需求: 爬取电影中文名英文名电影详情页链接导演主演上映年份国籍类型评分评分人数, 并保存到csv文件当中
目标url: https://movie.douban.com/top250

 2.所需库(如果安装失败,可以选择去Settings里去手动安装)

     (1)request  

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

        (2)  lxml

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lxml

 打开终端输入上两行代码即可安装成功

3.阶段实现代码

import csv
import requests
from lxml import etree
#目标url
url = "https://movie.douban.com/top250"
# 添加请求头信息
head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" }
#发送请求 获取响应
response = requests.get(url,headers=head)
print(response.text)

# 网页源码
html = response.text
# 实例化etree对象
tree = etree.HTML(html)

# 利用xpath找到<div class="info">这个标签
divs = tree.xpath('//div[@class="info"]')
# print(divs)
for div in divs:
    # title = div.xpath('./div[@class="hd"]/a/span/text()') #这句话需要理解
    # print(title)
    title_cn= div.xpath('./div[@class="hd"]/a/span/text()')[0]
    title_en = div.xpath('./div[@class="hd"]/a/span/text()')[1].strip('\xa0/\xa0')
    print(title_cn,title_en)
    break

# 获取电影链接
for div in divs:
    links = div.xpath('./div[@class="hd"]/a/@href')[0]
    print(links)
    break

# 获取导演,主演等信息
for div in divs:
    #导演
    director = div.xpath('./div[@class="bd"]/p/text()')[0].strip().split('导演: ')[1].split('主演: ')[0]
    print(director)
    #主演
    try:
        act = div.xpath('./div[@class="bd"]/p/text()')[0].strip().split('导演: ')[1].split('主演: ')[1]
        print(act)
    except IndexError as e:
        print("无主演信息")
    print(act)
    # 上映年份
    Release_year = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[0]
    print(Release_year)
    # 国籍
    nationality = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[1].strip()
    print(nationality)
    # 类型
    genre = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[2].strip()
    print(genre)
    break

for div in divs:
    # 评分
    score = div.xpath('./div[@class="bd"]/div/span[2]/text()')[0]
    print(score)
    # 评分人数
    num_score = div.xpath('./div[@class="bd"]/div/span[4]/text()')[0]
    print(num_score)
    # moive_list.append(dic)
    break

for page in range(1, 11):
    # 目标url
    url = f'https://movie.douban.com/top250?start={(page - 1) * 25}&filter='

    # 发送请求, 获取响应
    res = requests.get(url, headers=head)
    # 打印响应信息
    print(res.text)

4.完整代码

#导入模块
import requests
from lxml import etree
import csv

# 请求头信息
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}

moive_list = []

for page in range(1, 11):
    # 目标url
    url = f'https://movie.douban.com/top250?start={(page - 1) * 25}&filter='

    # 发送请求, 获取响应
    res = requests.get(url, headers=headers)
    # 打印响应信息
    # print(res.text)
    # 网页源码
    html = res.text
    # 实例化etree对象
    tree = etree.HTML(html)

    divs = tree.xpath('//div[@class="info"]')
    # print(divs)
    for div in divs:
        dic = {}
        title = div.xpath('./div[@class="hd"]/a/span[@class="title"]/text()')
        # 电影中文标题
        title_cn = ''.join(title).split('\xa0/\xa0')[0]
        dic['电影中文名'] = title_cn
        # 电影英文标题
        title_en = div.xpath('./div[@class="hd"]/a/span[2]/text()')[0].strip('\xa0/\xa0')
        dic['电影英文名'] = title_en
        # 电影详情页链接
        links = div.xpath('./div[@class="hd"]/a/@href')[0]
        dic['电影详情页链接'] = links
        # print(links)
        # 导演
        director = div.xpath('./div[@class="bd"]/p/text()')[0].strip().split('导演: ')[1].split('主演: ')[0]
        dic['导演'] = director
        # print(director)
        # 主演
        try:
            act = div.xpath('./div[@class="bd"]/p/text()')[0].strip().split('导演: ')[1].split('主演: ')[1]
            # print(act)
        except IndexError as e:
            print(end='')
        dic['主演'] = act
        # 上映年份
        Release_year = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[0]
        # print(Release_year)
        dic['上映年份'] = Release_year
        # print(Release_year)
        # 国籍
        nationality = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[1].strip()
        if len(nationality[0].encode('utf-8')) == 1:
            nationality = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[2].strip()
        else:
            nationality = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[1].strip()
        # print(nationality)
        dic['国籍'] = nationality
        # print(title_cn, nationality)
        # 类型
        genre = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[2].strip()
        if len(div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[1].strip()[0].encode('utf-8')) == 1:
            genre = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[3].strip()
        else:
            genre = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[2].strip()
        dic['类型'] = genre
        # print(genre)
        # 评分
        score = div.xpath('./div[@class="bd"]/div/span[2]/text()')[0]
        dic['评分'] = score
        # print(score)
        # 评分人数
        num_score = div.xpath('./div[@class="bd"]/div/span[4]/text()')[0]
        dic['评分人数'] = num_score
        # print(dic)
        moive_list.append(dic)
        # print(len(moive_list))  # 检查数据是否全部爬取成功
    print(f'*****************第{page}页爬取完成*****************')
print('*****************爬虫结束*****************')
# 数据保存
with open('豆瓣电影Top250.csv', 'w', encoding='utf-8-sig', newline='') as f:
    # 1. 创建对象
    writer = csv.DictWriter(f, fieldnames=('电影中文名', '电影英文名', '电影详情页链接', '导演', '主演', '上映年份', '国籍', '类型', '评分', '评分人数'))
    # 2. 写入表头
    writer.writeheader()
    # 3. 写入数据
    writer.writerows(moive_list)

5.将csv文件转化为xlsx

import pandas as pd

def csv_to_xlsx_pd():
    csv = pd.read_csv('豆瓣电影Top250.csv', encoding='utf-8')
    csv.to_excel('豆瓣电影Top250.xlsx', sheet_name='data')

if __name__ == '__main__':
    csv_to_xlsx_pd()

6.数据展示 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值