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

目录

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.mfbz.cn/a/401897.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

24款奔驰S400L升级原厂360全景影像 效果分享

今天给大家分享一款 接近百万豪车 奔驰S400L商务版 连360 小柏林都没有&#xff0c;奔驰果然是不坑穷人的&#xff0c;所以很多车主一提到车就升级成豪华型的配置&#xff0c;你说五米多才的车 没有原厂360全景影像 是多么的难受 倒车和狭窄路段很麻烦&#xff0c;所以车主找到…

基于EasyCVR视频汇聚系统的公安网视频联网共享视频云平台建设思路分析(一)

随着社会的发展和科技的进步&#xff0c;视频监控系统在各个领域的应用越来越广泛&#xff0c;视频云平台建设已经成为了行业数字化转型的重要一环。公安网视频汇聚联网共享云的建设需要充分考虑技术、架构、安全、存储、计算等多方面因素&#xff0c;以确保平台的稳定性和可用…

基于ExtendSim的半导体制造工厂仿真

这是一个离散事件模型&#xff0c;使用ExtendeSim “高级资源管理&#xff08;ARM&#xff09;”功能来组织和分配资源。 此模型使用离散事件仿真和高级资源管理&#xff08;ARM&#xff09;功能。ARM是一个集成系统&#xff0c;用于组织资源、区分资源并在整个模型中分配资源。…

PHP实现分离金额和其他内容便于统计计算

得到的结果可以粘贴到excel计算 <?php if($_GET["x"] "cha"){ $tips isset($_POST[tips]) ? $_POST[tips] : ; $pattern /(\d\.\d|\d)/; $result preg_replace($pattern, "\t\${1}\t", $tips); echo "<h2><strong>数…

Linux离线安装插件

当公司Linux环境无外网情况下&#xff0c;需要先下载好离线安装包&#xff0c;然后上传到服务器&#xff0c;进行安装。 这里介绍一个下载插件安装包的网站&#xff0c;可以搜索到lrzsz、lsof、telnet、unzip、zip等安装包 搜索到想要的插件安装包后&#xff0c;下载并上传到服…

门控时钟基础知识

什么是门控时钟 RTL中的门控时钟 通常情况下&#xff0c;时钟树由大量的缓冲器和反相器组成&#xff0c;时钟信号为设计中翻转率最高的信号&#xff0c;时钟树的功耗可能高达整个设计功耗40%。 加入门控时钟电路后&#xff0c;由于减少了时钟树的翻转&#xff0c;节省了翻转功…

#LLM入门|Prompt#1.7_文本拓展_Expanding

输入简短文本&#xff0c;生成更加丰富的长文。 “温度”&#xff08;temperature&#xff09;&#xff1a;控制文本生成的多样性。 一、定制客户邮件 根据客户的评价和其中的情感倾向&#xff0c;使用大语言模型针对性地生成回复邮件。将大大提升客户满意度。 # 我们可以在…

分享6个当下最受欢迎的 Vue UI 库

在本文中&#xff0c;我列出了前 6个最受欢迎的&#xff08;根据 NPM 下载量和 Github stars&#xff0c;从上到下排名&#xff09;UI 库&#xff0c;供您启动您梦想中的 Vue 项目。 Vue.js 作为一个 JavaScript 框架&#xff0c;由于其简单、易用和学习曲线&#xff0c;是 Rea…

Facebook的未来蓝图:数字社交的下一个篇章

在数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。而在众多的社交媒体平台中&#xff0c;Facebook一直处于领先地位&#xff0c;不断探索着数字社交的新领域和新形式。随着科技的不断发展和社会的不断变革&#xff0c;Facebook正在谱写着数字社交的未…

工业边缘网关的主要功能与应用价值分享-天拓四方

工业边缘网关&#xff0c;也称为工业物联网边缘计算网关&#xff0c;是一种部署在工业生产现场&#xff0c;具备数据采集、处理、存储和传输功能的智能设备。它能够将各种传感器、执行器、控制器等工业设备连接到网络&#xff0c;实现设备间的互联互通&#xff0c;同时提供边缘…

shapely 笔记 voronoi图

Voronoi 图是一种将平面分割成区域的方法&#xff0c;每个区域包含一个输入点&#xff0c;任何在该区域内的点都比其他输入点更接近该区域的输入点 1 基本使用方法 shapely.ops.voronoi_diagram(geom, envelopeNone, tolerance0.0, edgesFalse) 2 参数说明 geom任何几何类型…

船运物流管理系统|基于springboot船运物流管理系统设计与实现(源码+数据库+文档)

船运物流管理系统目录 目录 基于springboot船运物流管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员登录 2、货运单管理 3、公告管理 4、公告类型管理 5、新闻管理 6、新闻类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 …

Internet Download Manager 6.42.3 (IDM) 中文免激活绿色版

相信很多网友都遇到过一种情况&#xff0c;网页有些视频资源或者音频资源不知道如何下载&#xff0c;一直不知道如何解决&#xff0c;为此小编特意带来了这款&#xff1a;Internet Download Manager电脑版&#xff0c;这是一款非常专业且十分好用的下载工具&#xff0c;也就是大…

基于springboot + vue实现的前后端分离-酒店管理系统

项目介绍 基于springboot vue实现的酒店管理系统一共有酒店管理员和用户这两种角色。 管理员功能 登录&#xff1a;管理员可以通过登录功能进入系统&#xff0c;确保只有授权人员可以访问系统。用户管理&#xff1a;管理员可以添加、编辑和删除酒店的用户&#xff0c;包括前…

常见文档向量表示方法

参考&#xff1a;https://www.slidestalk.com/Milvus/doc2vecmilvus85394 相似文章召回&#xff0c;通常是指在信息检索、自然语言处理等领域中的一种技术手段。它的主要功能是根据用户提供的某篇文章或一段文本&#xff0c;通过算法模型快速、准确地从海量文本库中找出与之主题…

第二证券:权重板块引领市场走高 20只绩优大盘股仍超跌

2月21日&#xff0c;A股商场再现普涨行情&#xff0c;上证指数盘中一度逼近3000点关口。权重股扎堆的沪深300指数上涨1.35%&#xff0c;领涨其他指数。北上资金也大举加仓&#xff0c;全天净流入近136亿元&#xff0c;其间沪股通净流入96.41亿元&#xff0c;深股通净流入39.54亿…

源聚达电商:现在的抖音小店卖啥赚钱

在数字浪潮中&#xff0c;抖音小店如同一叶扁舟&#xff0c;乘风破浪于电商海洋。何为赚钱之本?答案藏匿在消费者的喜好与市场的缝隙之中。今日&#xff0c;让我们一同探索抖音小店盈利的秘诀。 个性化商品是小店的灵魂。消费者渴望独一无二&#xff0c;定制化产品如手工艺品、…

代码随想录算法训练营第二十四天 | 回溯算法理论基础,77. 组合 [回溯篇]

代码随想录算法训练营第二十四天 回溯算法理论基础什么是回溯法回溯法的理解回溯法模板 LeetCode 77.组合题目描述思路参考代码总结优化版本 回溯算法理论基础 文章讲解&#xff1a;代码随想录#回溯算法理论基础 视频讲解&#xff1a;带你学透回溯算法&#xff08;理论篇&#…

Springboot整合定时任务quartz(非集群)

文章目录 前言一、Springboot 整合1.1 Springboot 初步整合quartz1.1 jar 引入&#xff1a;1.2 添加任务&#xff1a;1.2.1 方式1 PostConstruct 注入任务&#xff1a;1.2.2 方式2 Bean 注入任务&#xff1a; 二、quartz持久化&#xff1a;2.1 mysql 引入&#xff1a;2.2 业务共…

flutter 文件上传组件和大文件分片上传

文件分片上传 资料 https://www.cnblogs.com/caijinglong/p/11558389.html 使用分段上传来上传和复制对象 - Amazon Simple Storage Service 因为公司使用的是亚马逊的s3桶 下面是查阅资料获得的 亚马逊s3桶的文件上传分片 分段上分为三个步骤&#xff1a;开始上传、上传对…
最新文章