【问题标题】:Constructing a regular expression for url in start_urls list in scrapy framework python在scrapy框架python的start_urls列表中为url构造正则表达式
【发布时间】:2012-05-24 13:34:37
【问题描述】:

我对scrapy很陌生,而且我之前没有使用过正则表达式

以下是我的spider.py代码

class ExampleSpider(BaseSpider):
   name = "test_code
   allowed_domains = ["www.example.com"]
   start_urls = [
       "http://www.example.com/bookstore/new/1?filter=bookstore",
       "http://www.example.com/bookstore/new/2?filter=bookstore",
       "http://www.example.com/bookstore/new/3?filter=bookstore",
   ]

   def parse(self, response):
       hxs = HtmlXPathSelector(response)

现在,如果我们查看start_urls,所有三个 url 都是相同的,只是它们的整数值不同 2?, 3? 等等,我的意思是根据网站上存在的 url 无限制,我现在可以使用 crawlspider,我们可以为 URL 构造正则表达式,如下所示,

    from scrapy.contrib.spiders import CrawlSpider, Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    import re

    class ExampleSpider(CrawlSpider):
        name = 'example.com'
        allowed_domains = ['example.com']
        start_urls = [
       "http://www.example.com/bookstore/new/1?filter=bookstore",
       "http://www.example.com/bookstore/new/2?filter=bookstore",
       "http://www.example.com/bookstore/new/3?filter=bookstore",
   ]

        rules = (
            Rule(SgmlLinkExtractor(allow=(........),))),
        ) 

   def parse(self, response):
       hxs = HtmlXPathSelector(response)

你能指导我吗,我怎样才能为上面的start_url 列表构建一个爬虫规则。

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    如果我对你的理解正确,你想要很多具有特定模式的起始 URL。

    如果是这样,您可以覆盖BaseSpider.start_requests 方法:

    class ExampleSpider(BaseSpider):
        name = "test_code"
        allowed_domains = ["www.example.com"]
    
        def start_requests(self):
            for i in xrange(1000):
                yield self.make_requests_from_url("http://www.example.com/bookstore/new/%d?filter=bookstore" % i)
    
        ...
    

    【讨论】:

    • 非常感谢它对我非常有用,我得到了我的输出
    • 当然我会投票,我们如何才能使 xrange 的值不受限制,因为实际上我每页有 20 个项目(限制为)(如果在页面上添加了额外的项目,则带有递增整数的 URL 将如上例所示创建),并且 URL 中存在的整数将继续增加。所以有没有办法将该范围设为无限。
    • 无限数意味着无限的处理时间。如果您仍然确定,请循环:i = 0; while True: yield ...
    【解决方案2】:

    如果您使用的是 CrawlSpider,覆盖 parse 方法通常不是一个好主意。

    规则对象可以将你感兴趣的url过滤到你不关心的url。

    请参阅文档中的CrawlSpider 以供参考。

    from scrapy.contrib.spiders import CrawlSpider, Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    import re
    
    class ExampleSpider(CrawlSpider):
        name = 'example.com'
        allowed_domains = ['example.com']
        start_urls = ['http://www.example.com/bookstore']
    
        rules = (
            Rule(SgmlLinkExtractor(allow=('\/new\/[0-9]\?',)), callback='parse_bookstore'),
        )
    
    def parse_boostore(self, response):
       hxs = HtmlXPathSelector(response)
    

    【讨论】:

    • SgmlLinkExtractor 已经被弃用了一段时间。
    猜你喜欢
    • 2023-03-21
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2021-04-10
    • 2016-09-27
    • 1970-01-01
    相关资源
    最近更新 更多