如何使用scrapy从网站抓取有限数量的页面?

2023-12-25

我需要抓取多个网站,并且只想抓取每个网站一定数量的页面。那么如何实现呢?

我的想法是使用一个字典,其键是域名,值是已存储在 mongodb 中的页数。因此,当一个页面被抓取并成功存储到数据库中时,该域的页面数将增加1。如果数量大于最大数量,则蜘蛛应停止从该站点爬行。

下面是我的代码,但它不起作用。什么时候spider.crawledPagesPerSite[domain_name]大于spider.maximumPagesPerSite:,蜘蛛还在爬行。

class AnExampleSpider(CrawlSpider):
name="anexample"
rules=(
    Rule(LinkExtractor(allow=r"/*.html"),
    callback="parse_url",follow=True),
)   
def __init__(self, url_file ): #, N=10,*a, **kw
    data = open(url_file, 'r').readlines() #[:N]
    self.allowed_domains = [ i.strip() for i in data ] 
    self.start_urls = ['http://' + domain for domain in self.allowed_domains]
    super(AnExampleSpider, self).__init__()#*a, **kw

    self.maximumPagesPerSite=100 #maximum pages each site
    self.crawledPagesPerSite={}
def parse_url(self, response):
    url=response.url
    item=AnExampleItem()     
    html_text=response.body
    extracted_text=parse_page.parse_page(html_text)
    item["url"]=url
    item["extracted_text"]=extracted_text
    return item

class MongoDBPipeline(object):
    def __init__(self):
        self.connection = pymongo.MongoClient( settings['MONGODB_SERVER'], settings['MONGODB_PORT'] )

    def process_item(self, item, spider):
        domain_name=tldextract.extract(item['url']).domain
        db = self.connection[domain_name] #use domain name as database name
        self.collection = db[settings['MONGODB_COLLECTION']]
        valid = True
        for data in item:
            if not data:
                valid = False
                raise DropItem("Missing {0}!".format(data))
            if valid:
                self.collection.insert(dict(item))
                log.msg("Item added to MongoDB database!",level=log.DEBUG, spider=spider)
                if domain_name in spider.crawledPagesPerSite:
                    spider.crawledPagesPerSite[domain_name]+=1
                else:
                    spider.crawledPagesPerSite[domain_name]=1
                if spider.crawledPagesPerSite[domain_name]>spider.maximumPagesPerSite:
                    suffix=tldextract.extract(item['url']).suffix
                    domain_and_suffix=domain_name+"."+suffix

                    if domain_and_suffix in spider.allowed_domains:
                        spider.allowed_domains.remove(domain_and_suffix)
                        spider.rules[0].link_extractor.allow_domains.remove(domain_and_suffix)
                        return None
                return item

我不确定这是否是您正在寻找的,但我使用这种方法仅抓取一定数量的页面。假设我只想从 example.com 中抓取开始的 99 页,我将按以下方式进行:

start_urls = ["https://example.com/page-%s.htm" % page for page in list(range(100))]

到达第 99 页后,代码将停止工作。但这仅在您的网址中包含页码时才有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用scrapy从网站抓取有限数量的页面? 的相关文章

随机推荐

  • 在 sqlite 中制作字符串的规范化版本 - 波兰字符 ł

    Apple 提供了在数据库中使用存储在数据库中的文本的规范化版本创建附加列的示例 派生财产 https developer apple com library mac samplecode DerivedProperty Introduct
  • 更改线程实时调度策略失败:CONFIG_RT_GROUP_SCHED=y

    如果我在这里而不是超级用户发布此内容 我深表歉意 我试图在实时组中运行 docker 并且遇到了启用 cgroups CONFIG RT GROUP SCHED在内核中运行实时 docker 应用程序 此处 https docs docke
  • 从List>中获取对象并存储在ViewModel中

    建议 想要有逻辑地阅读答案 gt gt 选择 TAB 最旧的 Goal Presentation of books with related inventorydetails on homepage such as Book Title I
  • jQuery 中的自动完成功能以及动态添加的元素

    我的要求是当用户在输入字段之一输入一些字符 至少 3 个 时显示几个选项 这些字符也可能会动态添加 由于数据很大 我无法在页面加载时加载数据 有一个 ajax 调用来获取过滤后的数据 我得到的问题是Expected identifier第
  • 如何用JavaScript测试两个对象是否相同?

    我需要一个函数 function isSame a b 其中 如果a和b相同 则返回true 我试过return a b 但我发现 将返回 false 我期望这个函数可以得到一些结果 isSame 3 14 3 14 true isSame
  • Webpack 2 - 如何停止生成 CSS 和 HTML 的 .js 文件?

    我是 Webpack 2 的新手 所以请原谅我到目前为止的简单理解 根据网上的一些教程 我拼凑了一个工作package json and webpack babel config js file 本质上 我试图将 SCSS 转换为 CSS
  • MS SQL Server 2008“带(无锁)”相当于 IBM DB2 9.7

    在 MS SQL Server 2008 中你可以这样写 FROM EMPLOYEE as A with nolock DB2 9 7 是否有等效语法 谢谢 DB2 未提交的读取 与您一起 SELECT FROM whatevertable
  • apache 别名与符号链接

    在 UNIX 系统上使用 apache 时 如果您的文件系统在 home me web icons 中有图标 并且您希望浏览器能够在调用 url 时显示它们http www me com icons myicon jpg http www
  • 使用多值位置字段在 solr 中搜索

    我可以为 solr 中的位置类型字段索引多个值 修改后的响应schema xml索引修改后的 exampledocs 看起来像 查询 http 192 168 3 19 8983 solr select wt json indent tru
  • 从 iOS 应用程序内生成条形码

    我想获取一个数字字符串并生成一个可以由任何扫描仪读取的简单条形码 我已经可以使用相机并读取条形码 但现在我想生成条形码 有谁知道有一个 sdk 可以让我做到这一点 资源或代码片段吗 谢谢 唯一可以做到这一点的免费图书馆是可可触摸条形码 ht
  • 从 SignalR 调用特定客户端

    我想从服务器调用特定客户端 而不是广播给所有客户端 问题是我在一些 AJAX 请求的范围内 比如说在 aspx 代码隐藏中 而不是在 Hub 或 PersistentConnection 中 所以没有 Clients 属性 并且进行 aja
  • 文件在被取消之前上传[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 这里遇到了
  • 在 Windows 程序集中使用 nasm 的 Hello World

    我在用着nasm http sourceforge net projects nasm 编译以下程序集 然而 代码在 Windows 下的控制台中崩溃了 C gt nasm f win32 test asm o test o C gt ld
  • 多个函数中的未绑定本地错误[重复]

    这个问题在这里已经有答案了 我一直在创建一系列随机事件 其中每个函数对一组主要变量执行不同的操作 但我不断收到未绑定的本地错误 这是我的代码的简化版本 variable 1 def main global variable secondar
  • 如何使用 C# .NET 4.5 将文件从 ZIP 存档读取到内存而不先将其解压到文件?

    NET Framework 4 5 通过以下类添加了对 ZIP 文件的支持System IO Compression 假设我有 ZIP 存档sample xml根目录下的文件 我想直接从存档读取此文件到内存流 然后将其反序列化为自定义 NE
  • DocuSign getRecipientView ttl_expired 错误

    我正在使用 DocuSign API 发布到收件人帖子视图 URL 我收到一个响应 URL 但如果我按照该 URL 操作 它会告诉我 event ttl expired 示例网址 https demo docusign net Signin
  • 为什么VBS不能正确读取这个文本文件?

    我有以下代码来读取文本文件 Option Explicit Dim InputFile Dim FSO oFile Dim strData InputFile C Program Files x86 AVG CloudCare Client
  • JavaScript Array#map:索引参数

    我的问题是关于mapJavaScript 中的数组方法 您可以向它传递一个带有第二个参数的函数 即正在处理的数组的当前元素的索引 但是 目的是什么 当你这样做时会发生什么 当你不这样做时会发生什么区别 您会使用此功能做什么 当前项的索引始终
  • Google Chrome 中大型 html 表格的滚动行为缓慢

    我正在尝试创建一个带有滚动条的大型 HTML 表 大约 5000 行 因此我考虑将该表插入到 div 然后我可以随意格式化 它在 Firefox 47 和 IE 11 中运行良好 但在 Chrome 59 中滚动行为缓慢 工作演示 http
  • 如何使用scrapy从网站抓取有限数量的页面?

    我需要抓取多个网站 并且只想抓取每个网站一定数量的页面 那么如何实现呢 我的想法是使用一个字典 其键是域名 值是已存储在 mongodb 中的页数 因此 当一个页面被抓取并成功存储到数据库中时 该域的页面数将增加1 如果数量大于最大数量 则