2.5《Python3 网络爬虫开发实战》学习之实例实战1

news2024/12/27 13:49:02

目录

1 实战内容

2 确定思路

3 代码实操

3.1 实现一个个网页的爬取

3.2 爬取每一个网页的电影详情页url

​编辑

3.3 连接链接,针对每个详情页链接进行爬取、汇总内容

3.4 存储在txt文件中

4 结尾:整体代码


1 实战内容

        爬取Scrape | Movie中所有电影的详情页的电影名、种类、信息、简介、分数,并将其存储在txt文件中(一个电影一个文件),以电影名命名。

2 确定思路

(一)分析网页,发现网站整体有10个网页,所以先要实现一个个网页的爬取;

(二)对于一个网页,先要得到每个电影的详情页的url;

(三)针对详情页的url,爬取相应内容,并汇总这一个电影的内容

(四)存储。

3 代码实操

3.1 实现一个个网页的爬取

        分析网页链接,发现10个网页的链接的不同点只是在于末尾的page数字发生了变化。所以此时直接用f‘ ’构造网页,改变最后一个数字即可。

import requests
import re


if __name__ == '__main__':
    base_url = 'https://ssr1.scrape.center'
    page = 10
    for i in range(1, page+1):
        url = f'{base_url}/page/{i}'
        response = requests.get(url)
        content = response.text

        此时得到了每一个网页的内容,之后我们根据内容去获取链接。

3.2 爬取每一个网页的电影详情页url

        分析网页,发现第一个电影《霸王别姬》的详情页的链接如下:

        所以我们的目标就是爬取href中的内容。

        这里我们先以爬取一个网页的所有详情页的href为例:

# 定义一个函数scrape_url用于对网页内容进行爬取

def scrape_url(content):
    pattern = re.compile('<a.*?href="(.*?)" class="name">')
    urls = re.findall(pattern, content)
    print(urls)

        上面是第一个网页中的链接,我的思路是将所有链接都放在一个列表中,之后直接将这个列表的链接与最初的链接连接起来,依次访问,从而实现第三步,所以之后做出以下更改。

        在主函数中添加一个url_list负责存储链接。

import requests
import re


def scrape_url(content, url_list):
    pattern = re.compile('<a.*?href="(.*?)" class="name">')
    urls = re.findall(pattern, content)
    url_list.extend(urls)
    return url_list


if __name__ == '__main__':
    base_url = 'https://ssr1.scrape.center'
    page = 10
    url_list = []
    for i in range(1, page+1):
        url = f'{base_url}/page/{i}'
        response = requests.get(url)
        content = response.text
        url_list = scrape_url(content, url_list)

    print(url_list)

3.3 连接链接,针对每个详情页链接进行爬取、汇总内容

        连接链接的时候注意多或少一个 /。

        此函数在主函数中调用。

def scrape_detail(base_url, url_list):
    url_number = len(url_list)
    for i in range(url_number):
        url = base_url + url_list[i]
        response = requests.get(url)
        content = response.text

        # 用正则表达式爬取相应内容
        pattern_title = re.compile('<h2.*?class="m-b-sm">(.*?)</h2>')
        pattern_cata = re.compile('<button.*?mini">.*?<span>(.*?)</span>', re.S)
        pattern_info = re.compile('<span data-v-7f856186.*?>(.*?)</span>')
        pattern_drama = re.compile('<div.*?class="drama">.*?<p.*?>(.*?)</p></div>', re.S)
        pattern_score = re.compile('<p.*?class="score.*?>(.*?)</p>',re.S)

        title = re.findall(pattern_title, content)
        cata = re.findall(pattern_cata, content)
        info = re.findall(pattern_info, content)
        drama = re.findall(pattern_drama, content)
        score = re.findall(pattern_score, content)

        # 汇总内容
        movie_dict = {
            'title': title[0],
            'categories': cata,
            'info': info,
            'drama': drama[0].strip(),
            'score': score[0].strip()
        }

下面将访问第一个详情页的链接之后得到的movie_dict展示:

3.4 存储在txt文件中

        我是想直接将这个字典存入txt文件中,所以这里需要用到 json 库。json.dump方法,可以将数据保存为文本格式, ensure_ascii=False,可以保证中文字符在文件中以正常中文文本呈现,不乱码。indent=2,设置JSON数据的结果有两行缩进,更美观。

        此函数在scrape_detail中调用.

def save_data(movie_dict, title):
    data_path = f'result/{title}.txt'
    with open(data_path, 'w', encoding='utf-8') as f:
        json.dump(movie_dict, f, ensure_ascii=False, indent=2)
    f.close()

这里以访问前三个详情链接的结果展示:

4 结尾:整体代码

import requests
import re
import json


def save_data(movie_dict, title):
    data_path = f'result/{title}.txt'
    with open(data_path, 'w', encoding='utf-8') as f:
        json.dump(movie_dict, f, ensure_ascii=False, indent=2)
    f.close()


def scrape_url(content, url_list):
    pattern = re.compile('<a.*?href="(.*?)" class="name">')
    urls = re.findall(pattern, content)
    url_list.extend(urls)
    return url_list


def scrape_detail(base_url, url_list):
    url_number = len(url_list)
    for i in range(url_number):
        url = base_url + url_list[i]
        response = requests.get(url)
        content = response.text

        # 用正则表达式爬取相应内容
        pattern_title = re.compile('<h2.*?class="m-b-sm">(.*?)</h2>')
        pattern_cata = re.compile('<button.*?mini">.*?<span>(.*?)</span>', re.S)
        pattern_info = re.compile('<span data-v-7f856186.*?>(.*?)</span>')
        pattern_drama = re.compile('<div.*?class="drama">.*?<p.*?>(.*?)</p></div>', re.S)
        pattern_score = re.compile('<p.*?class="score.*?>(.*?)</p>',re.S)

        title = re.findall(pattern_title, content)
        cata = re.findall(pattern_cata, content)
        info = re.findall(pattern_info, content)
        drama = re.findall(pattern_drama, content)
        score = re.findall(pattern_score, content)

        # 汇总内容
        movie_dict = {
            'title': title[0],
            'categories': cata,
            'info': info,
            'drama': drama[0].strip(),
            'score': score[0].strip()
        }
        print(movie_dict)

        # 存储数据
        save_data(movie_dict, title[0])


if __name__ == '__main__':
    base_url = 'https://ssr1.scrape.center'
    page = 10
    url_list = []
    for i in range(1, page+1):
        url = f'{base_url}/page/{i}'
        response = requests.get(url)
        content = response.text
        url_list = scrape_url(content, url_list)

    scrape_detail(base_url, url_list)

本人新手,若有错误,欢迎指正;若有疑问,欢迎讨论。若文章对你有用,点个小赞鼓励一下,谢谢,一起加油吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1463025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vi/Vim 使用小窍门,如何消除搜索后的关键字高亮

Vim/Vi 基本上是 *nix 世界最受欢迎的编辑器了&#xff0c;不知道为什么&#xff0c;一直以来觉得和 Emacs 比起来&#xff0c;Vim 更加有亲和力。用起来很舒服。 今天就记录一个困扰了我很久的问题。 大家应该都知道&#xff0c;在 Vi 里面如果要搜索某个关键字&#xff0c;…

观察者模式, 发布-订阅模式, 监听器模式

观察者模式, 发布-订阅模式, 监听器模式 观察者模式 观察者模式是一种行为型设计模式, 定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新 角色模型和结构图 在观察者模式中&#xff0c;只有两种…

详解Monkey自动化测试(日志分析)

讲解如何利用monkey分析ANR、CRASH、以及monkey运行期间的系统日志。 1.log文件配置 首先对于report的日志命名需要有相应的规范&#xff0c;这里建议是将level 1的文件命名为verbose,将level 2的文件命名为error。前者主要是用来观看日志信息和事件分布信息&#xff0c;后者…

雷卯有多种400V以上的TVS产品供您选择

1.400V以上的TVS主要应用领域 1&#xff09;电力系统保护&#xff1a;在电力系统中&#xff0c;电压突然升高或突然降低可能会导致电气设备受损或故障。400V以上的TVS可用于保护变压器、发电机和其他电力设备免受过电压或电涌的影响。 2&#xff09;工业自动化&#xff1a;在…

el-table增加/编辑打开el-dialog内嵌套el-form,解决编辑重置表单不成功等问题

需求&#xff1a;在做表格的增删改查&#xff0c;其中新增和编辑弹窗都是同一个弹窗&#xff0c;之后有个重置按钮&#xff0c;需要用户输入的时候可以重置清空等。本文章解决如下问题 1.就是在编辑数据回填后点击重置表单没有清空也没有报错 2.解决清空表单和表格数据相互影响…

YOLO v9 思路复现 + 全流程优化

YOLO v9 思路复现 全流程优化 提出背景&#xff1a;深层网络的 信息丢失、梯度流偏差YOLO v9 设计逻辑可编程梯度信息&#xff08;PGI&#xff09;&#xff1a;使用PGI改善训练过程广义高效层聚合网络&#xff08;GELAN&#xff09;&#xff1a;使用GELAN改进架构 对比其他解法…

01 Linux简介

Linux背景 发展史 linux从哪来的&#xff1f;怎么发展的&#xff1f;得从UNIX说起 1968年&#xff0c;一些来自通用电气公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念1969-1970年&am…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(4.详解Hash数据结构)

Hash数据结构 看过前面的介绍,大家应该知道 Redis 的 Hash 结构的底层实现在 6 和 7 是不同的,Redis 6 是 ziplist 和 hashtable,Redis 7 是 listpack 和 hashtable。 我们先使用config get hash*看下 Redis 6 和 Redis 7 的 Hash 结构配置情况(在Redis客户端的命令行界面…

2-21算法习题总结

由于蓝桥杯的题,我不知道从怎么复制,就只能粘贴图片了 翻硬币 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String start sc.next();char[] starts start.toCharArray();String end sc…

Redis面试题及核心知识点讲解

redis是单线程还是多线程&#xff1f; redis是单线程的&#xff0c;主要是指网络I/O线程。Redis的持久化&#xff0c;集群同步等操作&#xff0c;则由另外的线程来执行。 2 . redis是单线程&#xff0c;为什么处理这么快&#xff1f; Redis的大部分操作都是在内存中完成。单线…

选择VR全景行业,需要了解哪些内容?

近年来&#xff0c;随着虚拟现实、增强现实等技术的持续发展&#xff0c;VR全景消费市场得以稳步扩张。其次&#xff0c;元宇宙行业的高速发展&#xff0c;也在进一步拉动VR全景技术的持续进步&#xff0c;带动VR产业的高质量发展。作为一种战略性的新兴产业&#xff0c;国家和…

一分钟学会MobaXterm当Linux客户端使用

一、介绍 MobaXterm是一款功能强大的远程计算机管理工具&#xff0c;它集成了各种网络工具和远程连接协议&#xff0c;可以帮助用户在Windows系统上轻松管理远程计算机。MobaXterm支持SSH、Telnet、RDP、VNC等多种远程连接协议&#xff0c;同时还集成了X11服务器&#xff0c;可…

react hook使用UEditor引入秀米图文排版

里面坑比较多&#xff0c;细节也比较多 以下使用的是react 18 ice3.0&#xff0c;使用其他react脚手架的配置基本相同&#xff0c;例如umi4 1.下载UEditor 进入UEditor仓库&#xff0c;找到版本v1.4.3.3&#xff0c;点击进去 接着下载ueditor1_4_3_3-utf8-jsp.zip版本 下载好…

iMazing2024Windows和Mac的iOS设备管理软件(可以替代iTunes进行数据备份和管理)

iMazing2024是一款兼容 Windows 和 Mac 的 iOS 设备管理软件&#xff0c;可以替代 iTunes 进行数据备份和管理。以下是一些 iMazing 的主要功能和优点&#xff1a; 数据备份和恢复&#xff1a;iMazing 提供了强大的数据备份和恢复功能&#xff0c;可以备份 iOS 设备上的各种数据…

精品基于jsp+SSM实现的仓储物流管理系统-驿站快递登记取件

《[含文档PPT源码等]精品基于jspSSM实现的仓储物流管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版…

使用 package.json 配置代理解决 React 项目中的跨域请求问题

使用 package.json 配置代理解决 React 项目中的跨域请求问题 当我们在开发前端应用时&#xff0c;经常会遇到跨域请求的问题。为了解决这个问题&#xff0c;我们可以通过配置代理来实现在开发环境中向后端服务器发送请求。 在 React 项目中&#xff0c;我们可以使用 package…

MyBatis-Plus:通用分页实体封装

分页查询实体&#xff1a;PageQuery package com.example.demo.demos.model.query;import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.Data; import org.springframework.util.St…

linux 系统的目录结构

为什么某些执行程序位于/bin、/sbin、/usr/bin或/usr/sbin目录下&#xff1f;例如&#xff0c;less命令位于/usr/bin目录下。为什么不是/bin、/sbin或/usr/sbin&#xff1f;这些目录之间有什么区别呢&#xff1f; 在这篇文章中&#xff0c;让我们主要讲述一下Linux文件系统结构…

css实现梯形

<div class"trapezoid"></div> .trapezoid {width: 200px;height: 0;border-bottom: 100px solid red; /* 定义梯形的底边 */border-left: 50px solid transparent; /* 定义梯形的左边 */border-right: 50px solid transparent; /* 定义梯形的右边 */} …

【测试】----JMeter性能测试工具入门篇

定义&#xff08;主要测试的是接口&#xff09; JMeter是Apache组织使用Java开发的一款测试工具&#xff0c;可以对服务器&#xff0c;网络或者对象模拟巨大的负载情况&#xff1b;通过创建带有断言的脚本来验证程序是否能返回期望的结果 优缺点 优点 开源免费跨平台&#xff0…