Как передать входные аргументы сканеру scrapy, доступ к которому осуществляется с помощью файла python? - PullRequest
0 голосов
/ 25 апреля 2019

Я хочу обработать несколько онлайн веб-страниц в файлы CSV. Чтобы сделать это, я создал websccraper с scrapy, который работает, выполняя файл python. Он запускается путем выполнения файла python.

python3 find_clubs.py

Я попытался добавить args / * args в качестве параметра для класса find_clubs, который не работал.

from twisted.internet import reactor
import scrapy
import argparse
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
import csv

class find_clubs(scrapy.Spider):
    name = "find_clubs"

    def start_requests(self):
        urls = [
            'http://www.footballsquads.co.uk/netherl/2017-2018/nethere.htm',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        links = response.xpath('//div[@id="main"]/*/*/@href').getall()
        clubs = response.xpath('//div[@id="main"]/*/*/text()').getall()
        record_list = [ list(item) for item in list(zip(clubs, links)) ]

        with open("ERE1718_clubs.csv", "w") as fp:
            writer = csv.writer(fp)
            writer.writerows(record_list)


configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})
runner = CrawlerRunner()

d = runner.crawl(find_clubs)
d.addBoth(lambda _: reactor.stop())
reactor.run()

Теперь я бы хотел передать аргументы скребку. Например:

python3 find_clubs.py --URL=netherlands.htm --YEAR=1819

Я нашел скребок из файла в документации о скрапе. Другие программисты, похоже, решили эту проблему, изменив часть init . У меня нет этой функции, но скрипт работает нормально.

Очевидно, я хочу выполнить скребок рекурсивно для всех доступных соревнований и лет.

1 Ответ

0 голосов
/ 25 апреля 2019

Пример

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

использование: test.py -i <inputfile> -o <outputfile>

Вот следующий скрипт для test.py:

#!/usr/bin/python3

import sys, getopt

def main(argv):
   inputfile = ''
   outputfile = ''
   try:
      opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
   except getopt.GetoptError:
      print ('test.py -i <inputfile> -o <outputfile>')
      sys.exit(2)
   for opt, arg in opts:
      if opt == '-h':
         print ('test.py -i <inputfile> -o <outputfile>')
         sys.exit()
      elif opt in ("-i", "--ifile"):
         inputfile = arg
      elif opt in ("-o", "--ofile"):
         outputfile = arg
   print ('Input file is "', inputfile)
   print ('Output file is "', outputfile)

if __name__ == "__main__":
   main(sys.argv[1:])

Выходные данные Теперь запустите приведенный вышеСценарий следующий -

$ test.py -h
usage: test.py -i <inputfile> -o <outputfile>

$ test.py -i BMP -o
usage: test.py -i <inputfile> -o <outputfile>

$ test.py -i inputfile -o outputfile
Input file is " inputfile
Output file is " outputfile
...