Python爬蟲網安-項目-簡單網站爬取

源碼:

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…