第一種、使用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檔案所在路徑...