Моя проблема в том, что когда я добавил код перенаправления из Не удается заставить Scrapy проанализировать и выполнить 301, перенаправления 302 в мой скрипт, это решило проблему в том, что теперь он работает без ошибок, ноТеперь я не получаю вывод в мой CSV-файл.Проблема в том, что в parse_links1 операторы if и else заканчиваются оператором yield, и это, похоже, препятствует реализации строки scrapy.Request.Это довольно ясно, так как в предыдущей итерации этого кода, который опустился только на 2 уровня ссылок, код работал отлично.Но поскольку последний уровень имеет проблему с перенаправлением, мне пришлось добавить этот код.
Мой код такой:
class TurboSpider(scrapy.Spider):
name = "fourtier"
handle_httpstatus_list = [404]
start_urls = [
"https://ttlc.intuit.com/browse/cd-download-support"]
# def parse gets first set of links to use
def parse(self, response):
links = response.selector.xpath('//ul[contains(@class,
"list-unstyled")]//@href').extract()
for link in links:
yield scrapy.Request(link, self.parse_links,
dont_filter=True)
def parse_links(self, response):
tier2_text = response.selector.xpath('//a[contains(@class,
"dropdown-item-link")]//@href').extract()
for link in tier2_text:
schema = 'https://turbotax.intuit.com/'
links_to_use = urlparse.urljoin(schema, link)
yield scrapy.Request(links_to_use, self.parse_links1)
def parse_links1(self, response):
tier2A_text = response.selector.xpath('//a').extract()
for t in tier2A_text:
if response.status >= 300 and response.status < 400:
# HTTP header is ascii or latin1, redirected url will be percent-encoded utf-8
location=
to_native_str(response.headers['location'].decode('latin1'))
request = response.request
redirected_url = urljoin(request.url, location)
if response.status in (301, 307) or request.method
== 'HEAD':
redirected =
request.replace(url=redirected_url)
yield redirected
else:
redirected =
request.replace(url=redirected_url,
method='GET', body='')
redirected.headers.pop('Content-Type', None)
redirected.headers.pop('Content-Length', None)
yield redirected
yield scrapy.Request((t, self.parse_links2))
def parse_links2(self, response):
divs = response.selector.xpath('//div')
for p in divs.select('.//p'):
yield{'text':p.extract()}
Что не так с тем, как я настроил«yield» в функции parse_links1, так что теперь я не получаю вывод?Как объединить несколько команд yield?