gpt4 book ai didi

python - 使用中间件忽略 Scrapy 中的重复项

转载 作者:太空狗 更新时间:2023-10-29 18:29:42 25 4
gpt4 key购买 nike

我是 Python 初学者,我正在使用 Scrapy 进行人员 Web 项目。

我使用Scrapy反复从多个网站提取数据,所以我需要在添加链接之前检查每个爬行是否已经在数据库中。我在 piplines.py 类中这样做:

class DuplicatesPipline(object):
def process_item(self, item, spider):
if memc2.get(item['link']) is None:
return item
else:
raise DropItem('Duplication %s', item['link'])

但我听说使用中间件更适合这项任务。

我发现在 Scrapy 中使用中间件有点困难,任何人都可以将我重定向到一个好的教程。

欢迎提出建议。

谢谢,

编辑:

我正在使用 MySql 和内存缓存。

根据@Talvalin 的回答,这是我的尝试:

# -*- coding: utf-8 -*-

from scrapy.exceptions import IgnoreRequest
import MySQLdb as mdb
import memcache

connexion = mdb.connect('localhost','dev','passe','mydb')
memc2 = memcache.Client(['127.0.0.1:11211'], debug=1)

class IgnoreDuplicates():

def __init__(self):
#clear memcache object
memc2.flush_all()

#update memc2
with connexion:
cur = connexion.cursor()
cur.execute('SELECT link, title FROM items')
for item in cur.fetchall():
memc2.set(item[0], item[1])

def precess_request(self, request, spider):
#if the url is not in memc2 keys, it returns None.
if memc2.get(request.url) is None:
return None
else:
raise IgnoreRequest()

DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.IgnoreDuplicates': 543,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 500, }

但是爬取的时候好像忽略了process_request方法

提前致谢

最佳答案

下面是一些示例中间件代码,它从 sqlite3 表 (Id INT, url TEXT) 中加载 url 到一个集合中,然后根据该集合检查请求 url 以确定该 url 是否应该被忽略或不是。调整此代码以使用 MySQL 和内存缓存应该相当简单,但如果您有任何问题或疑问,请告诉我。 :)

import sqlite3
from scrapy.exceptions import IgnoreRequest

class IgnoreDuplicates():

def __init__(self):
self.crawled_urls = set()

with sqlite3.connect('C:\dev\scrapy.db') as conn:
cur = conn.cursor()
cur.execute("""SELECT url FROM CrawledURLs""")
self.crawled_urls.update(x[0] for x in cur.fetchall())

print self.crawled_urls

def process_request(self, request, spider):
if request.url in self.crawled_urls:
raise IgnoreRequest()
else:
return None

如果你有像我这样的导入问题并且要打你的显示器,上面的代码位于 middlewares.py 文件中,该文件位于顶级项目文件夹中以下 DOWNLOADER_MIDDLEWARES 设置

DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.IgnoreDuplicates': 543,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 500,
}

关于python - 使用中间件忽略 Scrapy 中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22963585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com