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 reif __name__ == '__main__':base_url = 'https://ssr1.scrape.center'page = 10for 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 redef scrape_url(content, url_list):pattern = re.compile('<a.*?href="(.*?)" class="name">')urls = re.findall(pattern, content)url_list.extend(urls)return url_listif __name__ == '__main__':base_url = 'https://ssr1.scrape.center'page = 10url_list = []for i in range(1, page+1):url = f'{base_url}/page/{i}'response = requests.get(url)content = response.texturl_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 jsondef 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_listdef 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 = 10url_list = []for i in range(1, page+1):url = f'{base_url}/page/{i}'response = requests.get(url)content = response.texturl_list = scrape_url(content, url_list)scrape_detail(base_url, url_list)

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

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

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

相关文章

板块一 Servlet编程:第七节 ServletContext对象全解与Servlet三大域对象总结 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程&#xff1a;第七节 ServletContext对象全解与Servlet三大域对象总结 一、什么是ServletContext对象二、获取ServletContext对象及常用方法&#xff08;1&#xff09;获取 ServletContext 对象&#xff08;2&#xff09;ServletContext对象提供的方法 三、se…

第六十六天 API安全-接口安全阿里云KEY%postmanDVWSXEE鉴权泄露

第66天 API安全-接口安全&阿里云KEY%postman&DVWS&XEE&鉴权&泄露 知识点 1.HTTP类接口-测评 2.RPC类接口-测评 3.Web Service类-测评 参考链接&#xff1a;https://www.jianshu.com/p/e48db27d7c70 内容点&#xff1a; SOAP(Simple Object Access Prot…

【FastAPI】P1 安装与第一个 FastAPI 应用

目录 FastAPI 安装第一个 FastAPI 应用代码拆解分析 FastAPI 安装 FastAPI 是用于快速构建 API 的 web 框架&#xff0c;依赖 Python 3.8 及更高版本。使用 pip 命令安装 fastapi&#xff1a; pip install fastapi安装异步处理 ASGI 的服务器 Uvicorn&#xff1a; pip insta…

dubbo源码中设计模式——注册中心中工厂模式的应用

工厂模式的介绍 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂模式属于创建型模式&#xff0c;它在创建对象时提供了一种封装机制&#xff0c;将实际创建对象的代码与使用代码分离。 应用场景&#xff1a;定义一个创建对象的接口&#xff0…

css中选择器的优先级

CSS 的优先级是由选择器的特指度&#xff08;Specificity&#xff09;和重要性&#xff08;Importance&#xff09;决定的&#xff0c;以下是优先级规则&#xff1a; 特指度&#xff1a; ID 选择器 (#id): 每个ID选择器计为100。 类选择器 (.class)、属性选择器 ([attr]) 和伪…

Sora 远比你想象的可怕,它颠覆的不是一个行业而是整个时代!

​&#x1f680; Sora&#xff1a;不仅仅是视频生成 &#x1f680; 在AI技术的新纪元&#xff0c;OpenAI带来了Sora——一个超越传统视频生成器的世界模拟器。这项技术的出现&#xff0c;不仅令人震惊&#xff0c;更是对未来的一次大胆预言。Sora所生成的影片&#xff0c;逼真到…

【Quasar】quasar轮播图进度条

效果 开始效果 即将结束 结束 码 <template><q-carouselv-model"slide"transition-prev"scale"transition-next"scale"swipeableanimatedinfiniteautoplaynavigationpaddingarrowsheight"300px"class"bg-primary text…

【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子

作者推荐 视频算法专题 涉及知识点 广度优先搜索 网格 割点 并集查找 LeetCode:1263. 推箱子 「推箱子」是一款风靡全球的益智小游戏&#xff0c;玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示&#xff0c;其中每个元素可以是墙、地板或…

S281 LoRa网关助力智慧城市建设的智能交通管理

S281 LoRa网关作为智慧城市建设中的重要组成部分&#xff0c;发挥着关键的作用&#xff0c;特别是在智能交通管理方面。通过连接各类传感器设备和物联网终端&#xff0c;S281 LoRa网关实现了对城市交通系统的远程监控、智能调度和信息化管理&#xff0c;为城市交通管理部门提供…

Python hasattr函数

在Python编程中&#xff0c;hasattr()函数是一个非常有用的内置函数之一&#xff0c;用于检查对象是否具有指定的属性或方法。这个函数能够帮助我们在运行时动态地检查对象的属性和方法&#xff0c;从而避免由于缺少属性或方法而导致的异常。本文将深入探讨Python中的hasattr()…

C++入门学习(三十二)二维数组定义方式

一维数组类似于一条“线”&#xff0c;而二维数组类似于一个“面”&#xff0c;二维数组也更像一个表格&#xff0c;由我们在“表格”中查询数据。 1、先定义数组&#xff0c;后赋值 int arr[2][3]; #include <iostream> using namespace std;int main() { int arr…

线性代数:线性方程组解的结构

目录 齐次/非齐次方程组的解 Ax 0 的解的性质 定理 Ax b 的解的性质 相关证明 例1 例2 例3 齐次/非齐次方程组的解 Ax 0 的解的性质 定理 Ax b 的解的性质 相关证明 例1 例2 例3

渗透测试—信息收集

渗透测试—信息收集 1. 收集域名信息1.1. 域名注册信息1.2. SEO信息收集1.3. 子域名收集1.3.1. 在线子域名收集1.3.2. 子域名收集工具 1.4. 域名备案信息1.5. ICP备案号查询1.6. SSL证书查询 2. 收集真实IP2.1. 超级ping2.2. Ping2.3. CDN绕过 3. 收集旁站或C段IP3.1. 旁站或C段…

Nginx-----------高性能的 Web服务端 location 优先级(二)

一、event事件 events {worker_connections 65536; #设置单个工作进程的最大并发连接数use epoll;#使用epoll事件驱动&#xff0c;Nginx支持众多的事件驱动&#xff0c;比如:select、poll、epoll&#xff0c;只能设置在events模块中设置。accept_mutex on; #on为同一时刻一个…

学习笔记-Git

Git 问题一描述解决方法注意事项 问题一 描述 在commit和push的时候因为网络太慢了中途强行关闭了进程&#xff0c;而push的内容因为文件过大导致无法正常push 按照原本的流程在push的时候会提示失败&#xff0c;并且需要在解决了大文件之后重新push 而因为中途中断了&#x…

异常统一处理:BusinessException(自定义业务异常)

一、引言 本篇内容是“异常统一处理”系列文章的重要组成部分&#xff0c;主要聚焦于对 BusinessException 的原理解析与异常处理机制&#xff0c;并给出测试案例。 关于 全局异常统一处理 的原理和完整实现逻辑&#xff0c;请参考文章&#xff1a; 《SpringBoot 全局异常统一…

云性能测试方法:优化应用性能的关键步骤

随着云计算的普及和应用程序的不断发展&#xff0c;对于云平台上应用程序性能的测试变得愈发重要。云性能测试方法是评估应用程序在云环境中的性能表现并识别改进机会的关键步骤之一。在本文中&#xff0c;我们将探讨云性能测试的方法和步骤&#xff0c;以帮助开发人员和测试人…

挑战杯 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

使用Templ进行Go模板化

使用Templ在Go项目中高效生成动态内容的指南 动态内容生成是Web开发的一个基本方面。无论您是在构建网站、Web应用程序还是API&#xff0c;根据数据和模板生成动态内容的能力都至关重要。在Go编程世界中&#xff0c;一个名为“Templ”的强大工具简化了这一过程。在这份全面的指…

Query Rewrite —— 基于大模型的query扩展改写,PRF(论文)

本文介绍了一篇典型的 PRF &#xff08;Pseudo-relevance feedback &#xff09;思路的论文&#xff0c;用于利用LLM来做query改写&#xff0c;提升召回率&#xff0c;召回效果。 论文地址&#xff1a;Large Language Models are Strong Zero-Shot Retriever 一、PRF的流程 如…