源码:

https://github.com/Wist-fully/Attack/tree/pc

pc_p1

目标:

1.进入列表页,顺着列表爬取每个电影详情页
2.利用正则来提取,海报,名称,类别,上映的时间,评分,剧情简介
3.将爬取的内容,保存下来

逻辑:

1.遍历所有的页码,拼接URL
2.拿到详情页页面的url
3.在详情页面用正则匹配出我们要的内容
4.详情页面正则提取
5.保存数据+优化

首先导入需要的模块,设置日志

#!/usr/bin/env pythonimport logging
import requests
import re
from urllib.parse import urljoin
import pymongologging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s')BASE_URL = 'https://ssr1.scrape.center'
TOTAL_PAGE = 10

核心代码

1.遍历所有的页码,拼接URL

#抓取某一页面的内容
def scrape_index(page):index_url = f'{BASE_URL}/page/{page}'return scrape_page(index_url)

2.拿到详情页页面的url

#定义一个函数抓取网页的内容    
def scrape_page(url):logging.info("正在抓取 %s.....",url)#发起get请求try:response = requests.get(url)if response.status_code == 200:return response.textelse:logging.error("抓取 %s 时返回无效的状态码 %s",url,response.status_code)except requests.RequestException :#如果发生异常,就报错logging.error("抓取%s时发生异常",url,exc_info=True) 

3.在详情页面用正则匹配出我们要的内容

def parse_index(html):#用正则把链接给提取出来# print(type(html))pattern = re.compile('<a.*href="(.*?)".*?class="name">')items = re.findall(pattern,html)# print(items)if not items:return []for item in items:#把相对链接转为绝对链接           detail_url = urljoin(BASE_URL,item)# print(detail_url)logging.info('找到详情页面了,链接%s',detail_url)yield detail_urldef main():for page in range(1,TOTAL_PAGE+1):index_html = scrape_index(page)detail_urls = parse_index(index_html)# print(list(detail_urls))logging.info('详细页面链接 %s', list(detail_urls))if __name__ == '__main__':main()      

4.详情页面正则提取

分析:

1.图片是个img标签拿到url
2.类别是两个button里面的span标签
3.上映时间是一个div里的span标签
4.评分是p标签 source
5.剧情简介也是一个p标签,外面有个div drama

def parse_detail(html):#匹配图片的urlcover_pattern = re.compile('class="el-col.*?<img.*?src="(.*?)".*?class="cover">', re.S)# cover_pattern = re.compile(#     '<img.*?src="(.*?)".*?class="cover">', re.S)#匹配电影名称name_pattern = re.compile('<h2.*?>(.*?)</h2>')#匹配类别categories_pattern = re.compile('<button.*?category.*?<span>(.*?)</span>.*?</button>', re.S)#匹配时间published_at_pattern = re.compile('(\d{4}-\d{2}-\d{2})\s?上映')#匹配剧情简介drama_pattern = re.compile('<div.*?drama.*?>.*?<p.*?>(.*?)</p>', re.S)#匹配评分score_pattern = re.compile('<p.*?score.*?>(.*?)</p>', re.S)cover = re.search(cover_pattern, html).group(1).strip() if re.search(cover_pattern, html) else Nonename = re.search(name_pattern, html).group(1).strip() if re.search(name_pattern, html) else Nonecategories = re.findall(categories_pattern, html) if re.findall(categories_pattern, html) else []published_at = re.search(published_at_pattern, html).group(1) if re.search(published_at_pattern, html) else Nonedrama = re.search(drama_pattern, html).group(1).strip() if re.search(drama_pattern, html) else Nonescore = float(re.search(score_pattern, html).group(1).strip()) if re.search(score_pattern, html) else None# print(type(cover))return {'cover': cover,'name': name,'categories': categories,'published_at': published_at,'drama': drama,'score': score}

5.保存数据+优化

#!/usr/bin/env pythonimport logging
import requests
import re
from urllib.parse import urljoin
import pymongo
import multiprocessingmongo_client = pymongo.MongoClient("mongodb://192.168.6.6:27017/")
db = mongo_client["my_movies"]
collection = db["movies"]logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s')BASE_URL = 'https://ssr1.scrape.center'
TOTAL_PAGE = 10
def save_data(data):collection.insert_one(data)logging.info("数据保存到mongodb成功!!!!")def main(page):# for page in range(1,TOTAL_PAGE+1):index_html = scrape_index(page)detail_urls = parse_index(index_html)for detail_url in detail_urls:detail_html = scrape_detail(detail_url)data = parse_detail(detail_html)logging.info('get detail data %s', data)save_data(data=data)logging.info('data saved successfully')def run_main(page):main(page)if __name__ == '__main__':# 获取CPU的核心数量num_process = multiprocessing.cpu_count()# 创建进程池pool = multiprocessing.Pool(num_process)# 要抓取的页面数量page_to_scrape = list(range(1, TOTAL_PAGE + 1))# 使用进程池运行pool.map(run_main, page_to_scrape)# 关闭进程池pool.close()

Python爬虫网安-logging模块日志管理-CSDN博客

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

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

相关文章

Golang中的数组

Golang Array和以往认知的数组有很大不同。有点像Python中的列表 1. 数组&#xff1a;是同一种数据类型的固定长度的序列。 2. 数组定义&#xff1a;var a [len]int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且是类型的组成部分。一…

《Origin画百图》之矩阵散点图

矩阵散点图的作用 一、直观展示多变量间的两两关系 矩阵散点图的基本单元是两两变量的散点图&#xff0c;每个散点图对应矩阵中的一个单元格&#xff0c;可直接反映变量间的&#xff1a; 相关性方向&#xff1a;正相关&#xff08;散点向右上倾斜&#xff09;或负相关&#x…

Flask文件下载send_file中文文件名处理解决方案

Flask文件下载send_file中文文件名处理解决方案 Flask文件下载中文文件名处理解决方案问题背景问题分析核心问题常见症状 解决方案技术实现关键技术点 完整实现示例 Flask文件下载中文文件名处理解决方案 问题背景 在Web应用开发中&#xff0c;当用户下载包含中文字符的文件时…

新手指南:在 Ubuntu 上安装 PostgreSQL 并通过 VS Code 连接及操作

本文档记录了一个初学者在 Ubuntu 系统上安装、配置 PostgreSQL 数据库&#xff0c;并使用 Visual Studio Code (VS Code) 作为客户端进行连接和操作的全过程。其中包含了遇到的常见错误、分析和最终的解决方案&#xff0c;旨在为新手提供一个清晰、可复现的操作路径。 最终目…

二刷 苍穹外卖day10(含bug修改)

Spring Task Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑 cron表达式 一个字符串&#xff0c;通过cron表达式可以定义任务触发的时间 **构成规则&#xff1a;**分为6或7个域&#xff0c;由空格分隔开&#xff0c;每个域代表一个含义 …

Android Native 之 inputflinger进程分析

Android IMS原理解析 - 简书 Android 输入事件分发全流程梳理&#xff08;一&#xff09;_android input事件分发流程-CSDN博客 Android 输入事件分发全流程梳理&#xff08;二&#xff09;_android输入事件流程图-CSDN博客 inputflinger模块与surfaceflinger模块在同级目录…

Python实例题:基于 Flask 的在线聊天系统

目录 Python实例题 题目 要求&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; Python实例题 题目 基于 Flask 的在线聊天系统 要求&#xff1a; 使用 Flask 框架构建一个实时在线聊天系统&#xff0c;支持以下功能&#xff1a; 用户注册、登录和个人资料管理…

v-bind指令

好的&#xff0c;我们来学习 v-bind 指令。这个指令是理解 Vue 数据驱动思想的基石。 核心功能&#xff1a;v-bind 的作用是将一个或多个 HTML 元素的 attribute (属性) 或一个组件的 prop (属性) 动态地绑定到 Vue 实例的数据上。 简单来说&#xff0c;它在你的数据和 HTML …

【设计模式04】单例模式

前言 整个系统中只会出现要给实例&#xff0c;比如Spring中的Bean基本都是单例的 UML类图 无 代码示例 package com.sw.learn.pattern.B_create.c_singleton;public class Main {public static void main(String[] args) {// double check locking 线程安全懒加载 ⭐️ //…

飞算科技依托 JavaAI 核心技术,打造企业级智能开发全场景方案

在数字经济蓬勃发展的当下&#xff0c;企业对智能化开发的需求愈发迫切。飞算数智科技&#xff08;深圳&#xff09;有限公司&#xff08;简称 “飞算科技”&#xff09;作为自主创新型数字科技公司与国家级高新技术企业&#xff0c;凭借深厚的技术积累与创新能力&#xff0c;以…

20250701【二叉树公共祖先】|Leetcodehot100之236【pass】今天计划

20250701 思路与错误记录1.二叉树的数据结构与初始化1.1数据结构1.2 初始化 2.解题 完整代码今天做了什么 题目 思路与错误记录 1.二叉树的数据结构与初始化 1.1数据结构 1.2 初始化 根据列表&#xff0c;顺序存储构建二叉树 def build_tree(nodes, index0):# idx是root开始…

Web应用开发 --- Tips

Web应用开发 --- Tips General后端需要做参数校验代码风格和Api设计风格的一致性大于正确性数据入库时间应由后端记录在对Api修改的时候&#xff0c;要注意兼容情况&#xff0c;避免breaking change 索引对于查询字段&#xff0c;注意加索引对于唯一的字段&#xff0c;考虑加唯…

CSS 安装使用教程

一、CSS 简介 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是用于为 HTML 页面添加样式的语言。通过 CSS 可以控制网页元素的颜色、布局、字体、动画等&#xff0c;是前端开发的三大核心技术之一&#xff08;HTML、CSS、JavaScript&#xff09;。…

机器学习中为什么要用混合精度训练

目录 FP16与显存占用关系机器学习中一般使用混合精度训练&#xff1a;FP16计算 FP32存储关键变量。 FP16与显存占用关系 显存&#xff08;Video RAM&#xff0c;简称 VRAM&#xff09;是显卡&#xff08;GPU&#xff09;专用的内存。 FP32&#xff08;单精度浮点&#xff09;&…

[附源码+数据库+毕业论文+答辩PPT]基于Spring+MyBatis+MySQL+Maven+vue实现的中小型企业财务管理系统,推荐!

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本中小型企业财务管理就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…

华为云Flexus+DeepSeek征文 | 对接华为云ModelArts Studio大模型:AI赋能投资理财分析与决策

引言&#xff1a;AI金融&#xff0c;开启智能投资新时代​​ 随着人工智能技术的飞速发展&#xff0c;金融投资行业正迎来前所未有的变革。​​华为云ModelArts Studio​​结合​​Flexus高性能计算​​与​​DeepSeek大模型​​&#xff0c;为投资者提供更精准、更高效的投资…

从模型部署到AI平台:云原生环境下的大模型平台化演进路径

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;部署只是起点&#xff0c;平台才是终局 在过去一年&#xff0c;大语言模型的飞速发展推动了AI生产力浪潮。越来越多…

UI前端大数据可视化创新:利用AR/VR技术提升用户沉浸感

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在大数据与沉浸式技术高速发展的今天&#xff0c;传统二维数据可视化已难以满足复杂数据场景的…

MacOS 安装brew 国内源【超简洁步骤】

​/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"请输入序号&#xff1a;1

GENESIS64:全球知名的工业设备监控与可视化平台

一、概述 GENESIS64是一款由ICONICS开发的先进工业自动化软件平台&#xff0c;专为实现实时数据可视化、智能化监控及管理而设计。该平台采用模块化架构&#xff0c;具有高效的数据处理能力和灵活的扩展性&#xff0c;适用于各类工业环境&#xff0c;帮助企业实现自动化运营&a…