5

我想解析站点地图并从站点地图中找出所有网址,然后在所有网址上附加一些单词,然后我想检查所有修改后的网址的响应代码。

对于这项任务,我决定使用scrapy,因为它可以抓取站点地图。它在 Scarpy 的文档中给出

在本文档的帮助下,我创建了我的蜘蛛。但我想在发送获取之前更改网址。所以为此我试图从这个链接中寻求帮助。此链接建议我使用rules和实施process_requests(). 但我无法利用这些。我有点厌倦了我的评论。任何人都可以帮我为注释行编写确切的代码或在scrapy中执行此任务的任何其他方式吗?

from scrapy.contrib.spiders import SitemapSpider
class MySpider(SitemapSpider):
    sitemap_urls = ['http://www.example.com/sitemap.xml']
    #sitemap_rules = [some_rules, process_request='process_request')]

    #def process_request(self, request, spider):
    #   modified_url=orginal_url_from_sitemap + 'myword'
    #   return request.replace(url = modified_url)        

    def parse(self, response):
        print response.status, response.url  
4

3 回答 3

2

您可以将 request_scheduled 信号附加到函数并在函数中执行您想要的操作。例如

class MySpider(SitemapSpider):

    @classmethod
    def from_crawler(cls, crawler):
        spider = cls()
        crawler.signals.connect(spider.request_scheduled, signals.request_scheduled)

    def request_scheduled(self, request, spider):
        modified_url = orginal_url_from_sitemap + 'myword'
        request.url = modified_url
于 2014-10-14T09:20:17.997 回答
1

SitemapSpidersitemap_filter方法。
您可以覆盖它以实现所需的功能。

class MySpider(SitemapSpider):

    ...
        def sitemap_filter(self, entries):

            for entry in entries:
                entry["loc"] = entry["loc"] + myword
                yield entry

每个entry对象都是具有如下结构的字典:

<class 'dict'>:
 {'loc': 'https://example.com/',
  'lastmod': '2019-01-04T08:09:23+00:00',
  'changefreq': 'weekly',
  'priority': '0.8'}

重要的提示!. SitemapSpider.sitemap_filter方法出现在 2019 年 1 月发布的 scrapy 1.6.0 1.6.0 发行说明 - 新的可扩展性功能部分

于 2020-09-29T11:48:40.690 回答
0

我刚刚面对这个。显然你不能真正使用process_requests,因为站点地图规则与对象SitemapSpider不同——只有后者可以有这个参数。RuleCrawlSpider

检查代码后,可以通过手动覆盖部分实现来避免这种SitemapSpider情况:

class MySpider(SitemapSpider):
    sitemap_urls = ['...']
    sitemap_rules = [('/', 'parse')]

    def start_requests(self):
        # override to call custom_parse_sitemap instead of _parse_sitemap
        for url in self.sitemap_urls:
            yield Request(url, self.custom_parse_sitemap)

    def custom_parse_sitemap(self, response):
        # modify requests marked to be called with parse callback
        for request in super()._parse_sitemap(response):
            if request.callback == self.parse:
                yield self.modify_request(request)
            else:
                yield request

    def modify_request(self, request):
        return request.replace(
            # ...
        )

    def parse(self, response):
        # ...
于 2020-09-23T23:53:11.433 回答