Python-爬蟲案例

Python-爬蟲案例

  • 代碼
  • 代碼

代碼

import requests
import json
import threading
from queue import Queue
import timeclass HeiMaTouTiao:def __init__(self):self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) ""AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/92.0.4515.107 Safari/537.36",'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIU''zI1NiJ9.eyJleHAiOjE2NTY2NTk3NjcsInVzZXJfaWQiOjEsInJlZn''Jlc2giOmZhbHNlLCJ2ZXJpZmllZCI6dHJ1ZX0.ZSdV5mT6w_yhEKLg''qcvWNln2GKHBxfxK7d8YXaoCMYg'}# URL隊列self.url_queue = Queue()# 提取的內容隊列self.content_queue = Queue()def get_url_list(self, start_page, end_page):url_temp = 'http://api-toutiao-web.itheima.net/mp/v1_0/articles?' \'page={}&per_page=10&response_type=comment'url_list = [url_temp.format(i) for i in range(start_page, end_page + 1)]for url in url_list:print('正在請求:', url)self.url_queue.put(url)def get_data(self):content_li = []while True:url = self.url_queue.get()comment = requests.get(url=url, headers=self.headers).textdata = json.loads(comment)data = data['data']['results']for index in range(len(data)):content = dict()content['標題'] = data[index]['title']if data[index]['comment_status'] is True:content['評論狀態'] = '正常'else:content['評論狀態'] = '關閉'content['總評論數'] = data[index]['total_comment_count']content['粉絲評論數'] = data[index]['fans_comment_count']content_li.append(content)self.content_queue.put(content_li)self.url_queue.task_done()def save_data(self):while True:content_list = self.content_queue.get()with open('toutiao.json', mode='a+', encoding='utf-8')as f:f.write(json.dumps(content_list, ensure_ascii=False, indent=2))self.content_queue.task_done()def run(self):start_page = int(input('請輸入抓取的起始頁:'))end_page = int(input('請輸入抓取的結束頁:'))# 線程列表t_list = []if start_page <= 0:print('抓取的起始頁從1開始。')else:t_url = threading.Thread(target=self.get_url_list, args=(start_page, end_page))t_list.append(t_url)# 提取內容線程for i in range(9):t_content = threading.Thread(target=self.get_data)t_list.append(t_content)# 保存數據t_save = threading.Thread(target=self.save_data)t_list.append(t_save)for t in t_list:t.setDaemon(True)t.start()for q in [self.url_queue, self.content_queue]:q.join()if __name__ == '__main__':heimatoutiao = HeiMaTouTiao()start_time = time.time()heimatoutiao.run()end_time = time.time()print(f'總用時:{end_time - start_time}秒')

這段Python代碼定義了一個名為 HeiMaTouTiao 的類,用于爬取和保存某學習網站上的文章信息。

代碼

import requests
import json
from pymongo import MongoClient
class LittleRabbit:def __init__(self):# 準備車載用品類頁面的URLself.init_url = 'https://apipc-xiaotuxian-front.itheima.net/category/goods/temporary'# 請求頭self.headers = {"Content-Type": "application/json;charset=utf-8",'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)''AppleWebKit/537.36 (KHTML, like Gecko)''Chrome/90.0.4430.212 Safari/537.36'}# 連接MongoDB的客戶端self.client = MongoClient('127.0.0.1', 27017)def load_category_page(self, page):"""抓取車載用品類商品展示頁面的數據:param page:待抓取的頁碼數:return:車載用品類下的所有商品"""# 準備請求體request_payload = {"page": page, "pageSize": 20, "categoryId": "1005009"}# 將字典form_data轉換為JSON字符串json_data = json.dumps(request_payload)response = requests.post(url=self.init_url, data=json_data,headers=self.headers)# 將服務器返回的JSON字符串先轉換成字典,再獲取字典中的商品信息all_goods = json.loads(response.text)["result"]["items"]return all_goodsdef load_detail_page(self, all_goods):"""抓取商品詳情頁的數據:param all_goods: 車載用品類下的所有商品:return: 所有商品的詳情信息"""# 準備基本URLbase_url = 'https://apipc-xiaotuxian-front.itheima.net/goods?'# 定義一個數組,保存所有商品的詳情信息goods_detail_info = []for good_info in all_goods:# 提取商品的ID標識good_id = dict(id=good_info['id'])# 根據拼接商品詳情頁的完整URL,發送GET請求response = requests.get(url=base_url, params=good_id)# 將服務器返回的JSON數據轉換為字典good_detail = json.loads(response.text)goods_detail_info.append(good_detail)return goods_detail_infodef parse_page(self, detail_data):"""解析商品詳情頁的數據,提取目標數據:param detail_data:所有商品的詳情數據:return:所有商品的信息"""# 定義一個列表,保存所有商品的信息all_goods_info = []temp_url = 'http://erabbit.itheima.net/#/product/'for info in detail_data:dict_data = dict()dict_data['商品名稱'] = info['result']['name']dict_data['商品描述'] = info['result']['desc']dict_data['商品鏈接'] = temp_url + info['result']['id']dict_data['商品價格'] = info['result']['price']# 獲取詳情頁面中的第一張圖片dict_data['商品圖片'] = info['result']['mainPictures'][0]good_detail = info['result']['details']['properties']dict_data['商品詳情'] = ''.join([':'.join(info.values()) + '\n' for info in good_detail])all_goods_info.append(dict_data)return all_goods_infodef save_data(self, goods_info):"""存儲商品詳情的數據:param get_goods_info:"""# 建立連接到本地的MongoDBclient = self.client# 訪問/創建數據庫rabbitdb = client.rabbitry:for good in goods_info:# 創建集合little_rabbit,并在該集合中插入文檔對象db.little_rabbit.insert_one(good)print('保存成功')# 訪問集合中的文檔對象result = db.little_rabbit.find()for doc in result:print(doc)except Exception as error:print(error)def run(self):"""啟動網絡爬蟲,控制網絡爬蟲的執行流程"""begin_page = int(input('起始頁碼:'))end_page = int(input('結束頁碼:'))if begin_page <= 0:print('起始頁碼從1開始')else:for page in range(begin_page, end_page + 1):print(f'正在抓取第{page}頁')all_goods = self.load_category_page(page)goods_detail = self.load_detail_page(all_goods)goods_info = self.parse_page(goods_detail)self.save_data(goods_info)if __name__ == '__main__':lr = LittleRabbit()lr.run()

用于爬取和存儲指定網站上的商品信息到MongoDB數據庫

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38304.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38304.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38304.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端筆記-day11

文章目錄 01-空間-平移02-視距03-空間旋轉Z軸04-空間旋轉X軸05-空間旋轉Y軸06-立體呈現07-案例-3D導航08-空間縮放10-動畫實現步驟11-animation復合屬性12-animation拆分寫法13-案例-走馬燈14-案例-精靈動畫15-多組動畫16-全民出游全民出游.htmlindex.css 01-空間-平移 <!D…

基于Spring Boot的在線醫療咨詢平臺的設計與實現【附源碼】

基于Spring Boot的在線醫療咨詢平臺的設計與實現 Design and implementation of the computer hardware mall based on Spring Boot Candidate&#xff1a; Supervisor&#xff1a; April 20th, 2024 學位論文原創性聲明 本人鄭重聲明&#xff1a;所呈交的論文是本人在導師…

初中英語優秀作文分析-006How to Deal with the Exam Stress-如何應對考試壓力

更多資源請關注紐扣編程微信公眾號 記憶樹 1 We students are very busy with schoolwork and in the face of many exams every school day. 翻譯 我們學生忙于功課&#xff0c;每個上學日都面臨許多考試。 簡化記憶 考試 句子結構 We students 主語 我們學生&#xf…

Vite: 高階特性 Pure ESM

概述 ESM 已經逐步得到各大瀏覽器廠商以及 Node.js 的原生支持&#xff0c;正在成為主流前端模塊化方案。 而 Vite 本身就是借助瀏覽器原生的 ESM 解析能力( type“module” )實現了開發階段的 no-bundle &#xff0c;即不用打包也可以構建 Web 應用。不過我們對于原生 ESM 的…

綜合評價類模型——突變級數法

含義 首先&#xff1a;對評價目標進行多層次矛盾分解其次&#xff1a;利用突變理論和模糊數學相結合產生突變模糊隸屬函數再次&#xff1a;由歸一公式進行綜合量化運算最終&#xff1a;歸一為一個參數&#xff0c;即求出總的隸屬函數&#xff0c;從而對評價目標進行排序分析特點…

【linux/shell實戰案例】shell中變量的使用

目錄 一.linux變量聲明及定義 二.linux變量使用方法 三.linux變量使用花括號${name}和雙引號“$name”的區別 四.linux變量使用單引號$name和雙引號“$name”的區別 五.linux變量中使用命令 一.linux變量聲明及定義 #!/bin/bash namezhaodabao 等號兩邊不能有空格變量名…

ES6面試題——箭頭函數和普通函數有什么區別

1. this指向問題 <script> let obj {a: function () {console.log(this); // 打印出&#xff1a;{a: ?, b: ?}},b: () > {console.log(this); // 打印出Window {window: Window, self: Window,...}}, }; obj.a(); obj.b(); </script> 箭頭函數中的this是在箭…

成都市水資源公報(2000-2022年)

數據年限&#xff1a;2000-2022年&#xff0c;無2009年 數據格式&#xff1a;pdf、word、jpg 數據內容&#xff1a;降水量、地表水資源量、地下水資源量、水資源總量、蓄水狀況、平原區淺層地下水動態、水資源情況分析、供水量、用水量、污水處理、洪澇干旱等

類似李跳跳的軟件有什么,強烈推薦所有安卓手機安裝!!!

今天阿星分享一款讓安卓手機更順滑的神器——智慧島。你問我李跳跳&#xff1f;由于大家都知道的原因&#xff0c;那是個曾經讓廣告無處遁形的神兵利器&#xff0c;可惜現在它已經退休了。不過別擔心&#xff0c;智慧島接過了接力棒&#xff0c;繼續為我們的安卓體驗保駕護航。…

Raccon:更好防側信道攻擊的后量子簽名方案

1. 引言 安全社區已經開發出了一些出色的加密算法&#xff0c;這些算法非常安全&#xff0c;但最終&#xff0c;所有的數據都會被存儲在硅和金屬中&#xff0c;而入侵者越來越多地會在那里放置監視器來破解密鑰。 破解加密密鑰通常涉及暴力破解方法或利用實施過程中的缺陷。然…

2029年AI服務器出貨量將突破450萬臺,AI推理服務器即將爆發式增長

在2020年&#xff0c;新冠疫情與遠程辦公模式的興起推動了所有類型服務器的出貨量達到峰值&#xff0c;隨后幾年里&#xff0c;除了AI服務器之外的所有類別都回歸到了正常水平。 根據Omdia的研究數據&#xff0c;AI服務器的出貨量在2020年急劇上升&#xff0c;并且至今未顯示出…

瀏覽器中如何獲取用戶網絡狀態

網頁開發中存在需要獲取用戶是否在線的場景及用戶網絡狀態&#xff0c;瀏覽器提了navigator.onLine和navigator.connection可以實現這一需求。 獲取在線狀態 if (navigator.onLine) {console.log("online"); } else {console.log("offline"); }監聽網絡狀…

日志的介紹

知識鋪墊&#xff1a;在我們日常開發中&#xff0c;其實日志是和我們息息相關的。但可能平常都沒怎么注意到日志相關的知識點&#xff0c;也不怎么關注日志&#xff0c;然后&#xff0c;在生產環境中&#xff0c;日志是必不可少的存在&#xff0c;項目出現問題了都是通過日志來…

cesium 添加 Echarts 圖層(空氣質量點圖)

cesium 添加 Echarts 圖層(下面附有源碼) 1、實現思路 1、在scene上面新增一個canvas畫布 2、通坐標轉換,將經緯度坐標轉為屏幕坐標來實現 3、將ecarts 中每個series數組中元素都加 coordinateSystem: ‘cesiumEcharts’ 2、示例代碼 <!DOCTYPE html> <html lan…

Excel 數據篩選難題解決

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

緩存穿透、雪崩與擊穿

緩存穿透、雪崩、擊穿 1、緩存穿透強調都沒有數據并發訪問布隆過濾器緩存NULL值 2、緩存雪崩強調批量Key過期并發訪問 3、緩存擊穿強調單個Key過期并發訪問互斥鎖邏輯過期 分布式并發控制 1、緩存穿透 緩存穿透是指數據庫和緩存都沒有的數據&#xff0c;這樣緩存永遠不會生效&…

圖形化用戶界面-java頭歌實訓

圖形化用戶界面 import java.awt.*; import javax.swing.*; public class GraphicsTester extends JFrame { public GraphicsTester() { super("Graphics Demo"); setSize(480, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void paint…

服務器raid5壞盤-換盤-修復陣列過程

目錄 背景原因分析解決步驟名詞解釋進入raid管理界面換回舊4號&#xff0c;進行import再次更換4號盤 總結 背景 服務器除塵之后文件服務器部分文件不能訪問了,部分文件夾內容為空&#xff0c;起初以為是新配置的權限的問題&#xff0c;排查之后發現不僅僅是權限問題 jumpserv…

ISA95-標準2-數據字典部分的解析與設計指南

在 MES/MOM 系統中,ISA-95 第二部分的數據字典扮演著至關重要的角色,它確保了數據的一致性和準確性,為不同系統間的數據交換提供了標準化的術語和定義。以下是 MES/MOM 系統實現 ISA-95 第二部分數據字典的具體概念、功能模塊以及應用場景: 一、概念、功能模塊以及應用場景…

numpy - array(4)

arr1 np.array([[1, 2], [3, 4], [5, 6]]) &#xff08;1&#xff09;def insert(arr, obj, values, axisNone) 向array指定位置插入指定值 axis為默認值None時&#xff0c;如果array是多維數據,則先將array轉化成向量obj&#xff1a;插入的索引&#xff0c;接受int或者多…