Скупки, сдающие предметы и запрашивающие ссылку последовательно - PullRequest
0 голосов
/ 05 марта 2019

мой паук начинается на этой странице https://finviz.com/screener.ashx и посещает каждую ссылку в таблице, чтобы получить некоторые элементы на другой стороне.Это работало отлично.Затем я захотел добавить еще один слой глубины, чтобы мой паук посетил ссылку на странице, которую он изначально посещал, примерно так:

start_urls > url > url_2

Паук должен посетить "URL", по пути получая некоторые предметы.Затем перейдите по ссылке "url_2" и получите еще несколько элементов, а затем перейдите к следующему URL-адресу из start_url.

Вот мой код паука:

import scrapy
from scrapy import Request
from dimstatistics.items import DimstatisticsItem

class StatisticsSpider(scrapy.Spider):
    name = 'statistics'

    def __init__(self):
        self.start_urls = ['https://finviz.com/screener.ashx? v=111&f=ind_stocksonly&r=01']

        npagesscreener = 1000

        for i in range(1, npagesscreener + 1):
            self.start_urls.append("https://finviz.com/screener.ashx? v=111&f=ind_stocksonly&r="+str(i)+"1")


    def parse(self, response):
        for href in response.xpath("//td[contains(@class, 'screener-body-table-nw')]/a/@href"):
            url = "https://www.finviz.com/" + href.extract()
            yield follow.Request(url, callback=self.parse_dir_contents)


    def parse_dir_contents(self, response):
        item = {}

        item['statisticskey'] = response.xpath("//a[contains(@class, 'fullview-ticker')]//text()").extract()[0]
        item['shares_outstanding'] = response.xpath("//table[contains(@class, 'snapshot-table2')]/tr/td/descendant::text()").extract()[9]
        item['shares_float'] = response.xpath("//table[contains(@class, 'snapshot-table2')]/tr/td/descendant::text()").extract()[21]
        item['short_float'] = response.xpath("//table[contains(@class, 'snapshot-table2')]/tr/td/descendant::text()").extract()[33]
        item['short_ratio'] = response.xpath("//table[contains(@class, 'snapshot-table2')]/tr/td/descendant::text()").extract()[45]
        item['institutional_ownership'] = response.xpath("//table[contains(@class, 'snapshot-table2')]/tr/td/descendant::text()").extract()[7]
        item['institutional_transactions'] = response.xpath("//table[contains(@class, 'snapshot-table2')]/tr/td/descendant::text()").extract()[19]
        item['employees'] = response.xpath("//table[contains(@class, 'snapshot-table2')]/tr/td/descendant::text()").extract()[97]
        item['recommendation'] = response.xpath("//table[contains(@class, 'snapshot-table2')]/tr/td/descendant::text()").extract()[133]

        yield item

        url2 = response.xpath("//table[contains(@class, 'fullview-links')]//a/@href").extract()[0]

        yield response.follow(url2, callback=self.parse_dir_stats)


    def parse_dir_stats(self, response):
        item = {}

        item['effective_tax_rate_ttm_company'] = response.xpath("//tr[td[normalize-space()='Effective Tax Rate (TTM)']]/td[2]/text()").extract()
        item['effective_tax_rate_ttm_industry'] = response.xpath("//tr[td[normalize-space()='Effective Tax Rate (TTM)']]/td[3]/text()").extract()
        item['effective_tax_rate_ttm_sector'] = response.xpath("//tr[td[normalize-space()='Effective Tax Rate (TTM)']]/td[4]/text()").extract()
        item['effective_tax_rate_5_yr_avg_company'] = response.xpath("//tr[td[normalize-space()='Effective Tax Rate - 5 Yr. Avg.']]/td[2]/text()").extract()
        item['effective_tax_rate_5_yr_avg_industry'] = response.xpath("//tr[td[normalize-space()='Effective Tax Rate - 5 Yr. Avg.']]/td[3]/text()").extract()
        item['effective_tax_rate_5_yr_avg_sector'] = response.xpath("//tr[td[normalize-space()='Effective Tax Rate - 5 Yr. Avg.']]/td[4]/text()").extract()

        yield item

Все xpaths и ссылки верны, сейчас я просто не могу ничего дать.У меня есть ощущение, что здесь есть очевидная ошибка.Моя первая попытка более сложного паука.

Любая помощь будет принята с благодарностью!Спасибо!

*** РЕДАКТИРОВАТЬ 2

{'statisticskey': 'AMRB', 'shares_outstanding': '5.97M', 'shares_float': 
'5.08M', 'short_float': '0.04%', 'short_ratio': '0.63', 
'institutional_ownership': '10.50%', 'institutional_transactions': '2.74%', 
'employees': '101', 'recommendation': '2.30'}
2019-03-06 18:45:19 [scrapy.core.scraper] DEBUG: Scraped from <200 
https://www.finviz.com/quote.ashx?t=AMR&ty=c&p=d&b=1>
{'statisticskey': 'AMR', 'shares_outstanding': '154.26M', 'shares_float': 
'89.29M', 'short_float': '13.99%', 'short_ratio': '4.32', 
'institutional_ownership': '0.10%', 'institutional_transactions': '-', 
'employees': '-', 'recommendation': '3.00'}
2019-03-06 18:45:19 [scrapy.core.scraper] DEBUG: Scraped from <200 
https://www.finviz.com/quote.ashx?t=AMD&ty=c&p=d&b=1>
{'statisticskey': 'AMD', 'shares_outstanding': '1.00B', 'shares_float': 
'997.92M', 'short_float': '11.62%', 'short_ratio': '1.27', 
'institutional_ownership': '0.70%', 'institutional_transactions': '-83.83%', 
'employees': '10100', 'recommendation': '2.50'}
2019-03-06 18:45:19 [scrapy.core.scraper] DEBUG: Scraped from <200 
https://www.finviz.com/quote.ashx?t=AMCX&ty=c&p=d&b=1>
{'statisticskey': 'AMCX', 'shares_outstanding': '54.70M', 'shares_float': 
'43.56M', 'short_float': '20.94%', 'short_ratio': '14.54', 
'institutional_ownership': '3.29%', 'institutional_transactions': '0.00%', 
'employees': '1872', 'recommendation': '3.00'}
2019-03-06 18:45:19 [scrapy.core.scraper] DEBUG: Scraped from <200 
https://www.finviz.com/screener.ashx?v=111&f=geo_bermuda>
{'effective_tax_rate_ttm_company': [], 'effective_tax_rate_ttm_industry': 
[], 'effective_tax_rate_ttm_sector': [], 
'effective_tax_rate_5_yr_avg_company': [], 
'effective_tax_rate_5_yr_avg_industry': [], 
'effective_tax_rate_5_yr_avg_sector': []}
2019-03-06 18:45:25 [scrapy.core.scraper] DEBUG: Scraped from <200 
https://www.finviz.com/screener.ashx?v=111&f=geo_china>
{'effective_tax_rate_ttm_company': [], 'effective_tax_rate_ttm_industry': 
[], 'effective_tax_rate_ttm_sector': [], 
'effective_tax_rate_5_yr_avg_company': [], 
'effective_tax_rate_5_yr_avg_industry': [], 
'effective_tax_rate_5_yr_avg_sector': []}

*** РЕДАКТИРОВАТЬ 3

Удалось на самом деле заставить паука перейти к url2 и получить там предметы.Проблема в том, что он делает это редко.Большую часть времени он перенаправляет на правильную ссылку и ничего не получает, или, кажется, не перенаправляет вообще и продолжает.Не совсем уверен, почему здесь такое несоответствие.

2019-03-06 20:11:57 [scrapy.core.scraper] DEBUG: Scraped from <200 
https://www.reuters.com/finance/stocks/financial-highlights/BCACU.A>
{'effective_tax_rate_ttm_company': ['--'], 
'effective_tax_rate_ttm_industry': ['4.63'], 
'effective_tax_rate_ttm_sector': ['20.97'], 
'effective_tax_rate_5_yr_avg_company': ['--'], 
'effective_tax_rate_5_yr_avg_industry': ['3.98'], 
'effective_tax_rate_5_yr_avg_sector': ['20.77']}

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

1 Ответ

0 голосов
/ 06 марта 2019

url2 - относительный путь, но scrapy.Request ожидает полный URL.

Попробуйте:

yield Request(
    response.urljoin(url2),
    callback=self.parse_dir_stats)

Или даже проще:

yield response.follow(url2, callback=self.parse_dir_stats)
...