gpt4 book ai didi

python - 解析前检查 SitemapSpider 中的 url

转载 作者:太空宇宙 更新时间:2023-11-03 17:51:44 24 4
gpt4 key购买 nike

我有一个蜘蛛,每天都会抓取数十万个页面的网站。页面本身在发布后很少发生变化,但它们一直被删除/添加。大多数页面仅活跃几周或几个月。

因此,我想阻止我的蜘蛛在已经抓取过一次的页面后抓取这些页面,而如果在站点地图中找到该页面(这意味着该页面仍然存在),则只需对我的数据库进行快速 SQL 更新调用我可以更新“last_found_date”列)。

我想最好的方法是覆盖 SitemapSpider 并阻止蜘蛛在数据库中已存在该网址的情况下发送请求。

如何做到这一点?

最佳答案

我能够通过覆盖 start_request() 函数并基于 SitemapSpider 创建我自己的 parse_sitemap() 函数来解决这个问题 SitemapSpider _parse_sitemap()函数。

我通过以下方式做到了:

1) 在您自己的 Spider 的 __init__() 中。调用 parent init。这是 parse_sitemap 函数中的某些功能所必需的。

def __init__(self, *a, **kw):
super(HemnetSitemapSpider, self).__init__(*a, **kw)

2) 您需要创建自己的start_request()。如果不是,默认的 start_request() 将调用父级 _parse_sitemap()

def start_requests(self):
return (scrapy.Request(x, callback=self.parse_sitemap) for x in self.sitemap_urls)

3) 最后,您需要创建自己的 parse_sitemap()。进入 scrapy 包文件夹并打开包含父类的原始 sitemap.py 文件,然后复制 _parse_sitemap() 的整个函数。

在该函数中,有一部分表示:

elif s.type == 'urlset':
...

这部分查找不是子站点地图的 URL,您可以在此处进行检查以查看该 URL 是否已在您的数据库中或您想要执行的操作。

所以我的 parse_sitemap() 函数看起来像这样:

def parse_sitemap(self, response):
if response.url.endswith('/robots.txt'):
for url in sitemap_urls_from_robots(response.body):
yield Request(url, callback=self.parse_sitemap)
else:
body = self._get_sitemap_body(response)
if body is None:
log.msg(format="Ignoring invalid sitemap: %(response)s",
level=log.WARNING, spider=self, response=response)
return

s = Sitemap(body)
if s.type == 'sitemapindex':
for loc in iterloc(s, self.sitemap_alternate_links):
if any(x.search(loc) for x in self._follow):
yield Request(loc, callback=self.parse_sitemap)
# If this is a URL Set, then check if it has been parsed before.
elif s.type == 'urlset':
for loc in iterloc(s):
for r, c in self._cbs:
if r.search(loc):
# Check here for history URL
try:
self.cursor.execute('_YOUR_SQL_QUERY_', [loc])
row = self.cursor.fetchone()
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])

# If no row exist from that source, then send the request.
if row is None:
yield Request(loc, callback=c)
# Else, if this source already exists. Update the date_updated field
else:
# Update date_updated
try:
date = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
self.cursor.execute('_YOUR_UPDATE_QUERY_', [date, row[0]])
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])

# Break for loop.
break

关于python - 解析前检查 SitemapSpider 中的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29006788/

24 4 0
文章推荐: python - Pyinstaller 在使用 matplotlib 时显示一些错误
文章推荐: javascript - Bootstrap 导航项未出现在移动设备中
文章推荐: javascript - jQuery:根据 if/else 结果更改每个
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com