我在一家物流公司工作,我们试图实现自动化的部分原因在于跟踪各种货物的状态。
我开发了一种网络抓取器,该抓取器非常漂亮,它可以用于获取包含跟踪编号的excel表格,并使用这些编号从运营商的网站中刮除跟踪状态,只要编号列表少于10。这是因为运营商的网站一次只允许输入10个跟踪号码。
但是,在我们使整个跟踪部门自动化的计划中,我们将需要处理长度超过10个数字的列表。
我遇到的主要问题是Scrapy每次我要运行Jupyter笔记本时都要求我重新启动内核,这使我无法将跟踪号列表分成10个单独的列表。
是否有一种从内部循环Scrapy的方法?
到目前为止,我已经设法将跟踪号列表分成10个列表,并且我设法使用10个或更少跟踪号的单个列表运行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的输出是13种状态的列表,但我却得到了[]。
答案 0 :(得分:0)
您可以使用def closed(self, reason):
钩子。
您可以在其中重新启动:
process = CrawlerProcess()
process.crawl(ODFL)
process.start()