Есть ли способ зациклить Scrapy на разных формданных? - PullRequest
0 голосов
/ 23 апреля 2019

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

Я разработал веб-скребок, который прекрасно работает для того, чтобы взять таблицу Excel, содержащую номера отслеживания, и использовать эти номера для очистки статусов отслеживания с веб-сайта оператора связи, поскольку список чисел меньше 10. Это потому, что Веб-сайт перевозчика позволяет одновременно использовать только 10 номеров отслеживания.

Однако в нашем плане по автоматизации всего нашего подразделения по отслеживанию нам потребуется иметь дело со списками, длина которых превышает 10 номеров.

Основная проблема, с которой я сталкиваюсь, состоит в том, что Scrapy требует, чтобы я перезапускал ядро ​​в записной книжке Jupyter каждый раз, когда я хочу его запустить, и это не позволяет мне разбивать список номеров отслеживания на отдельные списки из десяти.

Есть ли способ зациклить Scrapy изнутри?

До этого момента мне удавалось объединить список номеров отслеживания в списки из десяти, и мне удалось запустить Scrapy с отдельными списками из десяти или менее номеров отслеживания, и это прекрасно работает.

import scrapy
import pandas as pd
from scrapy.crawler import CrawlerProcess


file = r"C:\Users\amars\Desktop\ODFL Tracking 4_23_2019.xlsx"

xl = pd.ExcelFile(file)

df1 = xl.parse('Data',names=['Ruan ID#','Carrier Pro','Tracking Status'])

prolist = df1['Carrier Pro'].tolist()
prolist = [' ' + str(i) for i in prolist]


def chunk(seq):
    a,b = divmod(len(seq),10)
    listy = []
    i = 0
    last = 0

    while i<a: 
        listy.append(seq[last:(last+10)])
        i = i+1
        last = last + 10

    listy.append(seq[last:(last+b)])

    return listy

if len(prolist) > 10:

    scraped_data = []
    prolist = chunk(prolist)


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

        for k in prolist:     
            prolist1 = k
            prolist1 = ''.join(prolist1)

                        #start requests method
            def start_requests(self):
                url1 = "https://www.odfl.com/Trace/standard.faces"
                yield scrapy.Request( url = url1 , callback=self.parse )


            def parse(self, response):
                        request = scrapy.FormRequest.from_response( response,
                        formxpath='//*[@id="traceForm:j_idt26"]/fieldset/textarea',                                      
                        formdata={'traceForm:j_idt31': prolist1},
                        callback=self.parse2
                        )

                        yield request

            def parse2(self, response):
                for i in [2,3,5,6,8,9,11,12,14,15]:
                    text1 = response.xpath('/html/body/div[7]/div/form/span[1]/div/div['+str(i)+']/fieldset/div[3]/div[2]/text()').extract_first()
                    scraped_data.append(text1)





process = CrawlerProcess()
process.crawl(ODFL)
process.start()


print(scraped_data)

Я ожидаю, что выводом scraped_data будет список из тринадцати состояний, но вместо этого я получаю [].

1 Ответ

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

Вы можете использовать крючок def closed(self, reason):.

Там вы можете перезагрузить:

process = CrawlerProcess()
process.crawl(ODFL)
process.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...