我写一个Scrapy蜘蛛,每天一次爬行一组网址。然而,其中一些网站非常大,所以我不能每天抓取整个网站,也不想产生大量的流量。
一个老问题(这里)问了一些类似的问题。但是,向上投票的响应只是指向一个代码段(此处),它似乎需要请求实例的某些内容,尽管响应中以及包含代码段的页面上都没有对此进行解释。
我试图理解这一点,但发现中间件有点混乱。无论是否使用链接的中间件,一个完整的刮板机示例都非常有用,该刮板机可以多次运行而无需重新访问URL。
我已经在下面发布了一些代码来启动程序,但我不一定需要使用这个中间件。任何可以每天爬行并提取新URL的爬行器都可以。显然,一种解决方案是编写一个包含已删除URL的字典,然后检查以确认每个新URL是否在字典中,但这似乎非常缓慢/低效。
蜘蛛
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
from cnn_scrapy.items import NewspaperItem
class NewspaperSpider(CrawlSpider):
name = "newspaper"
allowed_domains = ["cnn.com"]
start_urls = [
"http://www.cnn.com/"
]
rules = (
Rule(LinkExtractor(), callback="parse_item", follow=True),
)
def parse_item(self, response):
self.log("Scraping: " + response.url)
item = NewspaperItem()
item["url"] = response.url
yield item
项目
import scrapy
class NewspaperItem(scrapy.Item):
url = scrapy.Field()
visit_id = scrapy.Field()
visit_status = scrapy.Field()
中间件(ignore.py)
from scrapy import log
from scrapy.http import Request
from scrapy.item import BaseItem
from scrapy.utils.request import request_fingerprint
from cnn_scrapy.items import NewspaperItem
class IgnoreVisitedItems(object):
"""Middleware to ignore re-visiting item pages if they were already visited
before. The requests to be filtered by have a meta['filter_visited'] flag
enabled and optionally define an id to use for identifying them, which
defaults the request fingerprint, although you'd want to use the item id,
if you already have it beforehand to make it more robust.
"""
FILTER_VISITED = 'filter_visited'
VISITED_ID = 'visited_id'
CONTEXT_KEY = 'visited_ids'
def process_spider_output(self, response, result, spider):
context = getattr(spider, 'context', {})
visited_ids = context.setdefault(self.CONTEXT_KEY, {})
ret = []
for x in result:
visited = False
if isinstance(x, Request):
if self.FILTER_VISITED in x.meta:
visit_id = self._visited_id(x)
if visit_id in visited_ids:
log.msg("Ignoring already visited: %s" % x.url,
level=log.INFO, spider=spider)
visited = True
elif isinstance(x, BaseItem):
visit_id = self._visited_id(response.request)
if visit_id:
visited_ids[visit_id] = True
x['visit_id'] = visit_id
x['visit_status'] = 'new'
if visited:
ret.append(NewspaperItem(visit_id=visit_id, visit_status='old'))
else:
ret.append(x)
return ret
def _visited_id(self, request):
return request.meta.get(self.VISITED_ID) or request_fingerprint(request)
这里的事情,你想做的是能够有一个数据库,你的爬网是计划/cron的。不管你是否使用了dupflier.middleware,你仍然需要刮取整个站点。。。我觉得,尽管很明显,提供的代码不可能是整个项目,但这样做的代码太多了。
我不太确定你在刮什么,但我现在假设你有CNN作为你刮文章的项目URL?
我要做的是使用CNNs RSS提要,甚至是提供文章meta到期日期的站点地图,并使用操作系统模块。。。
使用正则表达式定义每个爬网实例的日期根据文章发布的日期限制爬网器定义的项目化部署和计划爬网到/在scrapinghub中使用scrapinghubs python api客户端迭代项目
仍然可以抓取整个网站的内容,但使用xmlspider或rssspider类可以更快地解析所有数据。。。现在db在“云”中可用。。。我觉得一个可以更模块化,具有项目的可扩展性,以及更容易的可移植性/交叉兼容性
我相信我描述的流程会受到一些修补,但这个想法是直截了当的。
什么是抓取频次 抓取频次是搜索引擎在单位时间内(天级)对网站服务器抓取的总次数,如果搜索引擎对站点的抓取频次过高,很有可能造成服务器不稳定,Baiduspider会根据网站内容更新频率和服务器压力等因素自动调整抓取频次。 什么情况下可以进行抓取频次上限调整 首先,Baiduspider会根据网站服务器压力自动进行抓取频次调整。其次,如果Baiduspider的抓取影响了网站稳定性,站长可以通过此
本文向大家介绍Python打印scrapy蜘蛛抓取树结构的方法,包括了Python打印scrapy蜘蛛抓取树结构的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python打印scrapy蜘蛛抓取树结构的方法。分享给大家供大家参考。具体如下: 通过下面这段代码可以一目了然的知道scrapy的抓取页面结构,调用也非常简单 希望本文所述对大家的Python程序设计有所帮助。
本文向大家介绍golang如何实现抓取IP地址的蜘蛛程序详解,包括了golang如何实现抓取IP地址的蜘蛛程序详解的使用技巧和注意事项,需要的朋友参考一下 背景 要做IP地址归属地查询,量比较大,所以想先从网上找到大部分的分配数据,写个蜘蛛程序来抓取入库,以后在程序的运行中不断进行维护、更新、完善。 一些关键点 goroutine的使用,让程序并行运行。 正则表达式分组信息提取的使用,正确的提取我
你好,我有麻烦试图刮数据从一个网站的建模目的(Fantsylabs dotcom)。我只是一个黑客,所以原谅我对comp sci行话的无知。我想完成的是... > 使用selenium登录网站,导航到有数据的页面。 这个过程的工作原理是登录,导航到正确的页面,但是一旦页面完成动态加载(30秒),就把它传递给美丽的汤。我在表中看到大约300个实例,我想刮......然而,bs4刮刀只吐出了300个实
问题内容: 我在一个要刮擦多个站点(可能是数百个站点)的项目中使用了scrapy,并且我必须为每个站点编写特定的蜘蛛。我可以使用以下命令在部署要抓取的项目中安排 一只 蜘蛛: 但是,如何一次计划一个项目中的 所有 蜘蛛呢? 所有帮助非常感谢! 问题答案: 我一次运行200个以上Spider的解决方案是为该项目创建一个自定义命令。有关实现自定义命令的更多信息,请参见http://doc.scrapy
我试图实现每秒循环一次的ScheduledExecutorService线程,但现在它只循环一次。 我的问题是如何设置它,使它周期性地循环,而不是一次迭代? 另外,如何将连接池传递给线程,以便每次迭代都可以查询数据库?任何帮助都非常感谢。