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.hqwc.cn/news/483652.html

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

相关文章

Redis之缓存击穿问题解决方案

文章目录 一、书接上文二、介绍三、解决方案1. 单例双检锁2. 缓存预热和定时任务 一、书接上文 Redis之缓存雪崩问题解决方案 二、介绍 缓存击穿就是大量并发访问同一个热点数据&#xff0c;一旦这个热点数据缓存失效&#xff0c;则请求压力都来到数据库。 三、解决方案 1…

基于FPGA的I2C接口控制器(包含单字节和多字节读写)

1、概括 前文对IIC的时序做了详细的讲解&#xff0c;还有不懂的可以获取TI的IIC数据手册查看原理。通过手册需要知道的是IIC读、写数据都是以字节为单位&#xff0c;每次操作后接收方都需要进行应答。主机向从机写入数据后&#xff0c;从机接收数据&#xff0c;需要把总线拉低来…

echarts series中的data属性添加动态数据后不显示问题,一处儿异步细节问题

当从后端获取到数据后&#xff0c;发现饼图并没有顺利加载数据出来&#xff0c;使用console.log()测试先后执行顺序&#xff0c;会发现饼图的方法会比请求先执行 此时就可以把饼图的方法放入到请求执行结束后 以下为修改前&#xff1a; 修改后&#xff1a; 一处儿异步的细节问…

网络编程知识整理

目录 1.1 引言 1.2 分层 1.3 TCP/IP的分层 1.4 互联网的地址 1.5 域名服务 1.6 封装 1.7 分用 1.8 端口号 1.1 引言 很多不同的厂家生产各种型号的计算机&#xff0c;它们运行完全不同的操作系统&#xff0c;但 T C P / I P协议族允许它们互相进行通信。这一点很让人感…

Shell 脚本系列 | shell三剑客

目录 1、三剑客介绍2、三剑客之—grep1. 常用参数2. 常用示例1.过滤以#开头的行和空白行2.找出所有的mp3文件包含艺术家jayZ&#xff0c;不包含remix3.计算匹配项的数目4.在匹配字符串周围打印出行5.匹配显示所有IP 3、三剑客之一sed1.常用参数2.常用示例1. 奇数行后增加2. 删除…

虚拟机 安装 centos7 带桌面

虚拟机 安装 centos7 流程 https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/ CentOS-7-x86_64-DVD-2009.iso vmware 安装 centos7 的时候&#xff0c; 如果 不是 选择的 稍后 安装操作系统 &#xff0c; 会不让你选择配置选项&#xff0c;自动帮你把系统…

百度地图海量点方案趟坑记录(百度地图GL版 + MapVGL + vue3 + ts)

核心需求描述 不同层级有不同的海量图标展示底层海量图标需要展示文字拖动、放大缩小都需要重新请求数据并展示固定地图中心点&#xff08;拖动、放大缩小&#xff0c;中心点始终在地图中心&#xff09; 示例图片&#xff1a;&#xff08;某些图片涉及公司数据&#xff0c;就未…

【力扣 - 翻转二叉树】

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 提示&#xff1a; 树中节点数目范围在 [0, 100] 内 -100 < Node.val < 100题解&#xff1a;递归 思路与算法 这是一道很经典的二叉树问题。显然&#xff0c;我们从…

Nginx配置组成与性能调优

目录 一、Nginx配置介绍 1. 模块组成 2. 图示 3. 相关框架 二. 配置调优 1. 全局配置 1.1 关闭版本和修改版本 1.2 修改启动的进程数 1.3 cpu与work进程绑定 1.4 pid路径 1.5 nginx进程的优先级&#xff08;work进程的优先级&#xff09; 1.6 调试work进程打开的文…

浅谈数字信号处理器的本质与作用:从定义、原理到应用场景

数字信号处理器&#xff08;DSP&#xff09;作为一种关键的电子元件&#xff0c;在通信、音频、图像处理等领域扮演着不可或缺的角色。然而&#xff0c;对于许多人来说&#xff0c;数字信号处理器的概念可能依然模糊&#xff0c;其作用和原理也许并不为人所熟知。因此&#xff…

单调栈总结以及Leetcode案例解读与复盘

单调栈总结以及Leetcode案例解读与复盘 一、单调栈是什么&#xff1f; 单调栈&#xff08;monotonous stack&#xff09;是指栈的内部从栈底到栈顶满足单调性的栈结构。 二、如何维护单调性 新元素入栈时&#xff0c;会与栈顶元素进行比较&#xff0c;使得栈始终保持单调性…

性能分析5部曲:瓶颈分析与问题定位,如何快速解决瓶颈?

一、引言 很多做性能测试的同学都问过我这样一个问题&#xff1a;鱼哥(Carl_奕然)&#xff0c;你说性能测试的重点是什么? 我的回答很简单&#xff1a;瓶颈分析与问题定位。 在性能项目的整个周期&#xff0c;不管是脚本设计&#xff0c;脚本编写还是脚本执行&#xff0c;都…