Scrapy 登录后删除URL列表

Scrapy 登录后删除URL列表,scrapy,Scrapy,要刮取的站点有多个具有多个页面的项目,需要登录。我试过: def start_request(self): return [scrapy.FormRequest(, callback=self.logged_in)] def logged_in(self, response): with open(...) as f: for url in f.readlines(): return scrapy.Request(url, callbac

要刮取的站点有多个具有多个页面的项目,需要登录。我试过:

def start_request(self):
    return [scrapy.FormRequest(, callback=self.logged_in)]

def logged_in(self, response):
    with open(...) as f:
        for url in f.readlines():
            return scrapy.Request(url, callback=self.parse)

def parse(self, response):
    ... do some scraping ...
    ... determine the url of the next page ...
    return scrapy.Request(... next page ..., self.parse)
这将导致对一个项目的所有页面进行刮取(登录成功),但随后停止

如果函数logged in()中的
return scrapy.Request()
替换为
yield scrapy.Request()
,则它将读取所有项目的首页

我玩弄了
return
s和
yield
s,但我无法让它刮去所有项目的所有页面

顺便说一句,我试图创建一个数组
start\u uls
,但这不起作用,因为它首先需要登录站点

  • return
    始终返回一次,因此不要期望返回多个请求,如果您希望返回多个请求,请使用
    yield
  • 有一个名为
    dont\u filter
    的参数,它可能会过滤对
    parse
    函数的调用
  • dont_filter(布尔)–表示调度程序不应筛选此请求。当您希望多次执行相同的请求以忽略重复项筛选器时,可使用此选项。小心使用,否则你会陷入爬行循环。默认为False


    @盖伊·加夫里利(Guy Gavriely)在
    返回方面提出了一个很好的观点。我想补充一点,您需要另一种解析方法来过滤所有需要的页面:

    def start_request(self):
        return [scrapy.FormRequest(, callback=self.logged_in)]
    
    def logged_in(self, response):
        with open(...) as f:
            for url in f.readlines():
                yield scrapy.Request(url, callback=self.parse)
    
    def parse(self, response):
        ... do some scraping ...
        yield scrapy.Request(... next page ..., self.parse_user)
    
    def parse_user(self, response):
        ... do some scraping ....
        yield items
    
    你还没做完!最终的解析方法可能需要迭代,例如:

    def parse(self, response):
        ... do some scraping ...
        for sel in (some_list_of_users_by_an_xpath):
            user_profile_tag = response.xpath('xpath_to_user_profile_urls')
            user_profile_url_clean = user_profile_tag(might need to clean prior to Request ie 'domain' + user_profile_tag or .split or .replace, etc.)
            yield scrapy.Request(user_profile_url_clean, self.parse_user)
    
    在这种情况下,parse函数每次都会解析该用户列表中的一个用户。然后,parse_用户将执行大部分实际的挖掘和刮取操作。完成后,它将返回到原始解析方法,并从列表中转到下一个解析方法


    祝你好运

    我尝试在两个请求中都不过滤,但似乎没有任何效果。如果我在第一个请求(在logged_in()中)中将return替换为yield,那么每个项目的第一页只会被刮去。@Guy是对的;请确保在
    for
    循环中不需要
    返回。在某些情况下,这样做是正确的,但您的不是其中之一。您是将
    Spider
    CrawlSpider
    分为子类还是其他类型?我假设您继承的是
    scrapy.Spider.Spider
    。事实上,我正在对Spider进行子类化。我将收益率更改为收益率。在@liam的parse()方法中,已知一组固定的要刮取的URL是正手的。在我遇到的情况下,下一个url是从当前页面中刮取的,用于进入下一个页面。我编辑了这个问题来展示这一点。我可以想象,在已知用户页面数量的情况下,区分parse和parse_user是有效的,但在我的情况下,我需要在同一个函数中刮取数据并确定下一个url。我不知道如何将其转换为一个包含两个解析函数的结构,正如答案所示。