Прежде всего, я считаю, что проблема возникает из-за того, как вы конвертируете объект DictReader
в список.
печать itemlist
дает:
[OrderedDict([('ANTONIO AMADOR', 'JOHN ROBERT'), (' ACOSTA ', ' ADAIR ')]), OrderedDict([('ANTONIO AMADOR', 'ROBERT CURTIS'), (' ACOSTA ', ' ADAMEK ')]), OrderedDict([('ANTONIO AMADOR', 'CY RITCHIE'), (' ACOSTA ', ' ADAMS ')])]
Я не думаю, что это то, что вы хотели. Чтобы исправить это, я использовал csv.reader(f)
, который читает каждую строку как (fname, lname)
кортеж.
Я также сделал некоторые другие изменения, насколько я могу судить, нет необходимости запрашивать страницу формы снова и снова, так что это просто запрашивается один раз, а затем для каждого имени в списке делается отправка формы.
Наконец, я также изменил использование пробелов, просто чтобы помочь с моей собственной читабельностью.
import csv
import scrapy
from scrapy.crawler import CrawlerProcess
class AmsrvsSpider(scrapy.Spider):
name = "amsrvsSpiderscript"
lead_url = "https://amsrvs.registry.faa.gov/airmeninquiry/Main.aspx"
start_urls = ["https://amsrvs.registry.faa.gov/airmeninquiry/Main.aspx"]
def parse(self, response):
with open("document.csv", "r") as f:
split_names = list(csv.reader(f))
print(split_names)
default_pload = {item.css('::attr(name)').get(default=''):
item.css('::attr(value)').get(default='')
for item in response.css("input[name]")
}
default_pload.pop('ctl00$content$ctl01$btnClear')
for fname, lname in split_names:
payload = dict(default_pload)
payload['ctl00$content$ctl01$txtbxFirstName'] = fname
payload['ctl00$content$ctl01$txtbxLastName'] = lname
print(fname, lname)
yield scrapy.FormRequest(self.lead_url,
formdata=payload,
dont_filter=True,
callback=self.parse_content
)
def parse_content(self, response):
name = response.css("a[id$='lnkbtnAirmenName']::text").get()
print(name)
if __name__ == "__main__":
c = CrawlerProcess({
'USER_AGENT': 'Mozilla/5.0',
'DOWNLOAD_TIMEOUT': 5,
'LOG_LEVEL': 'ERROR'
})
c.crawl(AmsrvsSpider)
c.start()
Это позволило решить проблему, связанную с невозможностью сгенерировать запрос для каждого имени, и получить требуемое связанное имя.
Обратите внимание, что document.csv я использовал для тестирования выглядит следующим образом:
ANTONIO AMADOR,ACOSTA
JOHN ROBERT,ADAIR
ROBERT CURTIS,ADAMEK
CY RITCHIE,ADAMS