scrapy實現去重爬蟲

2021-09-17 18:15:48 字數 2611 閱讀 9851

第一種、使用set()來去重只適合單次爬取

# 匯入異常處理模組

from scrapy.exceptions import dropitem

class

spidernamepipeline

(object):

def__init__

(self)

:#建立構造方法

self.title =

set(

)#定義集合

defprocess_item

(self, item, spider)

: title = item[

'title'

]#取出要進行判斷資料是否重複的字段

if title in self.title:

#如果存在集合中則直接刪除該項,後邊的**不再執行

raise dropitem(

'{}已存在'

.format

(title)

) self.title.add(title)

#如果資料不重複,則加入集合..

....

#插庫資料 寫在這裡即可。。。

return item

第二種、使用redis實現去重
import mysql.connector

import pandas as pd #用來讀mysql

import redis

redis_db = redis.redis(host=

'127.0.0.1'

, port=

6379

, db=4)

#連線redis,相當於mysql的conn

redis_data_dict =

"f_url"

#key的名字,寫什麼都可以,這裡的key相當於字典名稱,而不是key值。

class

duplicatespipeline

(object):

conn = mysql.connector.connect(user =

'root'

, password=

'yourpassword'

, database=

'dbname'

, charset=

'utf8'

)def

__init__

(self)

: redis_db.flushdb(

)#刪除全部key,保證key為0,不然多次執行時候hlen不等於0,剛開始這裡除錯的時候經常出錯。

if redis_db.hlen(redis_data_dict)==0

:#sql =

"select url from your_table_name;"

#從你的mysql裡提資料,我這裡取url來去重。

df = pd.read_sql(sql, self.conn)

#讀mysql資料

for url in df[

'url'

].get_values():

#把每一條的值寫入key的字段裡

redis_db.hset(redis_data_dict, url,0)

#把key欄位的值都設為0,你要設成什麼都可以,因為後面對比的是字段,而不是值。

defprocess_item

(self, item, spider)

:if redis_db.hexists(redis_data_dict, item[

'url'])

:#取item裡的url和key裡的字段對比,看是否存在,存在就丟掉這個item。不存在返回item給後面的函式處理

raise dropitem(

"duplicate item found: %s"

% item)

return item```

重點說一下,雖然redis是乙個鍵值對應的資料庫,但這裡為了速度用的是雜湊(

hash

),和一般的字典不一樣,比一般的字典多了個字段。詳細可以看這個[教程]

重點看hexists,hset,hlen,hgetall這幾個,在終端裡執行一下就明白了。教程裡都是命令列執行,和python裡的用法稍微有點不一樣。

redis雜湊結構:

結構:key field(字段) value

對應:redis_data_dict url(實際的url)

0(**裡設定成了0

)而item裡key是'url' value是實際的url

######相當於用key(redis_data_dict)的字段(url)來對比item['url']的值,存在為1(true),不存在就是0(false),我開始也是這裡暈的,後來列印出來才明白了。

如果要用:

把conn資料庫連線換成自己的

修改sql語句,df[

'url'

]然後把item[

'url'

]換成自己的,就可以了。

可以在程式中間加入print,把每一步列印出來,看數值是什麼就容易懂了。

感謝這位小夥伴的分享

scrapy結合redis實現增量爬取

pycharm實現scrapy爬蟲的生成和入門

雖然是用pycharm進行除錯,但是最開始一定不要在pycharm中生成專案,因為要用scrapy自己生成乙個專案,否則會缺少如同scrapy.cfg的配置檔案,導致unknown command crawl錯誤。所以先在自己想要的地方開始 scrapy startproject myproject...

爬蟲 Scrapy(三) 翻頁的實現

1.翻頁的實現 import scrapy import refrom scpy1.items import scpy1item class qiubai1spider scrapy.spider name qiubai1 allowed domains qiushibaike.com start ...

如何實現在scrapy除錯爬蟲

coding utf 8 from scrapy.cmdline import execute import sysimport os 在爬蟲資料夾下面自定義乙個main.py的檔案 file 指的是當前main.py檔案 os.path.abspath file 獲取當前main.py檔案所在路徑...