Как написать Scrapy, который start_url является выходом предыдущего паука? - PullRequest
0 голосов
/ 04 июля 2018

Я написал scmap для карты сайта, как показано ниже:

class filmnetmapSpider(SitemapSpider):
      name = "filmnetmapSpider"
      sitemap_urls = ['http://filmnet.ir/sitemap.xml']
      sitemap_rules = [
            ('/series/', 'parse_item')
      ]
      def parse_item(self, response):
         videoid = response.xpath('/loc/text()').extract()

и извлеките из него все URL;

Я хочу написать другого паука-скрапа, который start_url является выходом предыдущего паука (sitemapSpider)

как я могу это сделать ??

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Допустим, вы получаете вывод от вашего первого паука в формате csv, а код ниже будет читать этот файл построчно и очищать его, используя ваш xpath.

class Stage2Spider(scrapy.Spider):
name = 'stage2'
allowed_domains = []
start_urls = []
read_urls = open('collecturls.csv', 'r')
for url in read_urls.readlines():
    url = url.strip() 
    allowed_domains = allowed_domains + [url[4:]]
    start_urls = start_urls + [url]
read_urls.close()

надеюсь, это поможет.

0 голосов
/ 04 июля 2018

Вам нужна какая-то база данных или файл, чтобы хранить результаты одного паука и читать их в другом.

class FirstSpider(Spider):
    """First spider crawls something end stores urls in file, 1 url per newline"""
    name = 'first'
    start_urls = ['someurl']
    storage_file = 'urls.txt'

    def parse(self, response):
        urls = response.xpath('//a/@href').extract()
        with open(self.storage_file, 'a') as f:
            f.write('\n'.join(urls) + '\n')

class SecondSpider(Spider):
    """Second spider opens this file and crawls every line in it"""
    name = 'second'

    def start_requests(self):
        file_lines = open(FirstSpider.storage_file)
        for line in file_lines:
            if not line.strip():  # skip empty lines 
                continue
            yield Request(line.strip())
...