成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python爬蟲的任務數據操作的小技巧

開發 后端
爬取某網站的項目列表頁,獲取其url,標題等信息,作為后續爬取詳情頁的任務url。

 需求

爬取某網站的項目列表頁,獲取其url,標題等信息,作為后續爬取詳情頁的任務url。

[[282996]]

先上代碼

代碼

  1. # -*- coding: utf-8 -*- 
  2. # @Time : 2019-11-08 14:04 
  3. # @Author : cxa 
  4. # @File : motor_helper.py 
  5. # @Software: PyCharm 
  6.  
  7. import asyncio  
  8. import datetime 
  9. from loguru import logger 
  10. from motor.motor_asyncio import AsyncIOMotorClient 
  11. from collections import Iterable 
  12.  
  13. try: 
  14.     import uvloop 
  15.  
  16.     asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) 
  17. except ImportError: 
  18.     pass 
  19.  
  20. db_configs = { 
  21.     'host''127.0.0.1'
  22.     'port''27017'
  23.     'db_name''mafengwo'
  24.     'user''' 
  25.  
  26. class MotorOperation: 
  27.     def __init__(self): 
  28.         self.__dict__.update(**db_configs) 
  29.         if self.user
  30.             self.motor_uri = f"mongodb://{self.user}:{self.passwd}@{self.host}:{self.port}/{self.db_name}?authSource={self.db_name}" 
  31.         else
  32.             self.motor_uri = f"mongodb://{self.host}:{self.port}/{self.db_name}" 
  33.         self.client = AsyncIOMotorClient(self.motor_uri) 
  34.         self.mb = self.client[self.db_name] 
  35.     async def save_data_with_status(self, items, col="seed_data"): 
  36.         for item in items: 
  37.             data = dict() 
  38.             data["update_time"] = datetime.datetime.now() 
  39.             data["status"] = 0  # 0初始 
  40.             data.update(item) 
  41.             print("data", data) 
  42.             await self.mb[col].update_one({ 
  43.                 "url": item.get("url")}, 
  44.                 {'$set': data, '$setOnInsert': {'create_time': datetime.datetime.now()}}, 
  45.                 upsert=True
  46.  
  47.      async def add_index(self, col="seed_data"): 
  48.         # 添加索引 
  49.         await self.mb[col].create_index('url'

因為我的爬蟲是異步網絡模塊aiohttp寫的,所以選擇了pymongo的異步版本motor進行操作。

異步代碼的基本屬性就是async/await成對的出現,如果把上面的await和async去掉,就是類似pymongo的寫法了,這里異步不是重點,重點是我們怎么處理每條數據。

這里除了網頁的url,標題等信息,我需要附加3個字段。分別是create_time, status,update_time。

這三個字段分別代表,數據插入數據,狀態和更新時間。

那么我為什么添加三個字段呢?

首先,我們需要判斷每次的任務數據是否存在,我這里的情況是存在就更新不存在就插入,那么我就需要一個查詢條件,作為更新的條件,很顯然這里可以使用任務的url作為唯一條件(你還可以使用url+標題做個md5然后保存),好了查詢條件確定。

下面說create_time這個比較好理解就是數據插入時間,關鍵是為什么還要一個update_time,這個的話和status字段有一定的關系。畫重點:這個status作為后續爬蟲進行爬取的一個標志用。目前這個status有4個值,0-4,我這是這樣定義的,

0:初始狀態

1:抓取中的任務

2:抓取成功

3:抓取失敗

4:抓取成功但是沒有匹配到任務。

后面隨著任務的爬取,狀態也是不斷變化的,同時我們需要更新update_time為最新的時間。這個目前的話是體現不出來什么作用,它的使用場景是,重復任務的抓取,比如今天我抓取了任務列表里的url1、url2,第二天的時候我如果再抓到,為了區分是抓取失敗還是抓取成功,我們根據create_time和update_time就可以進行推斷了,如果兩者相同而且是當前的日期說明剛抓的,如果update_time的日期比create_time新可以說明,抓到了重復的任務。關于字段的設計就啰嗦這么些。

下面是實現,我們可以通過update_one方法,對數據作存在或者插入操作,因為url作為查詢條件,后面量大的話就最好添加一個索引。也就是上面的 add_index方法。

好了最好說插入更新的具體代碼

需要注意的是

  1. {'$set': data, '$setOnInsert': {'create_time': datetime.datetime.now()}} 

$setOnInsert里面使用的字段是數據不存在的時候才插入的,存在就不動了,只插入$set里面指定的。

另外$setOnInsert里面使用的字段不能在$set里面再次出現

upsert=True代表的是不存在就插入。

責任編輯:華軒 來源: Python學習開發
相關推薦

2022-08-15 15:43:29

Linuxcron

2016-10-20 20:21:09

Python爬蟲技巧

2016-10-21 14:35:52

Pythonwebget方法

2018-11-28 12:30:58

Python命令行編程語言

2020-10-19 19:25:32

Python爬蟲代碼

2009-06-15 15:54:53

Java中Cookie

2020-10-26 08:31:41

Python爬蟲開發

2020-08-21 08:52:09

Python數據分析工具

2016-08-05 15:33:26

Python編程異常

2022-03-11 19:54:07

Svelte應用程序JavaScript

2024-11-12 12:08:06

JSON數據技巧

2013-04-16 10:48:04

Python序列

2022-07-15 15:30:13

Python技巧

2022-06-21 09:02:49

python技巧

2023-10-26 18:03:14

索引Python技巧

2021-05-07 16:02:54

Python代碼優化

2021-06-16 10:50:16

Python代碼優化

2021-07-16 10:31:29

MySQLDump技巧

2023-09-15 12:34:23

2020-12-24 09:18:51

SQL數據庫函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线免费看 | 欧美精品一区二区三区四区五区 | 中文字幕一二三 | 在线伊人 | 精品一区二区三 | 欧美日韩精品久久久免费观看 | 国产精品一区久久久 | 欧洲精品一区 | 欧产日产国产精品国产 | 草久久久 | 91精品国产91久久久久久吃药 | 国产精品色 | 欧美激情五月 | 亚洲国产精品一区在线观看 | 亚洲免费一区 | 精品欧美黑人一区二区三区 | 91精品亚洲 | 国产成人久久久 | 中文字幕一区二区三区不卡 | 成人精品国产一区二区4080 | 毛片一级网站 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 欧美日韩视频 | 久久精品网 | 国产精品99一区二区 | 国产免费一区二区 | 在线看av网址| 老司机成人在线 | 久久久91 | 99热精品在线观看 | 国产精品毛片一区二区在线看 | 欧美一区在线看 | 羞羞网站免费观看 | 午夜免费观看体验区 | a爱视频 | 视频一二三区 | 国产色| 国产激情精品 | 成人国产一区二区三区精品麻豆 | 亚欧精品 | 日本涩涩网 |