Я хочу сканировать записи звонков с веб-сайта https://www.seekingalpha.com со скрапом.
Паук должен вести себя следующим образом: 1) В начале указан список балансовых единиц ccodes
.2) Для каждой компании все доступные транскрипционные URL анализируются с https://www.seekingalpha.com/symbol/A/earnings/transcripts. 3) С каждой транскрипционной URL анализируется связанный контент.
Сложность заключается в том, что https://www.seekingalpha.com/symbol/A/earnings/transcripts содержит бесконечную прокруткумеханизм.Поэтому идея состоит в том, чтобы индивидуально перебирать json-файлы https://www.seekingalpha.com/symbol/A/earnings/more_transcripts?page=1 с page=1,2,3..
, которые вызываются javascript.Файлы json содержат ключи html
и count
.Ключ html
должен использоваться для анализа URL-адресов стенограммы, ключ count
должен использоваться для остановки, когда больше нет URL-адресов.Критерии для этого count=0
.
Вот мой код.Мне уже удалось успешно разобрать первую страницу JSON для каждой балансовой единицы.Но я понятия не имею, как можно перебирать файлы json и останавливаться, когда URL-адресов больше нет.
import scrapy
import re
import json
from scrapy.http import FormRequest
from scrapy.selector import Selector
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = ["https://seekingalpha.com/account/login"]
custom_settings = { 'DOWNLOAD_DELAY': 2 }
loginData = {
'slugs[]': "",
'rt': "",
'user[url_source]': 'https://seekingalpha.com/account/login',
'user[location_source]': 'orthodox_login',
'user[email]': 'abc',
'user[password]': 'xyz'
}
def parse(self, response):
return scrapy.FormRequest.from_response(
response = response,
formdata = self.loginData,
formid = 'orthodox_login',
callback = self.verify_login
)
def verify_login(self, response):
pass
return self.make_initial_requests()
def make_initial_requests(self):
ccodes = ["A", "AB", "GOOGL"]
for ccode in ccodes:
yield scrapy.Request(
url = "https://seekingalpha.com/symbol/"+ccode+"/earnings/more_transcripts?page=1",
callback = self.parse_link_page,
meta = {"ccode": ccode, "page": 1}
)
def parse_link_page(self, response):
ccode = response.meta.get("ccode")
page = response.meta.get("page")
data = json.loads(response.text)
condition = "//a[contains(text(),'Results - Earnings Call Transcript')]/@href"
transcript_urls = Selector(text=data["html"]).xpath(condition).getall()
for transcript_url in transcript_urls:
yield scrapy.Request(
url = "https://seekingalpha.com"+transcript_url,
callback = self.save_contents,
meta = {"ccode": ccode}
)
def save_contents(self, response):
pass
Вы сможете выполнить код без аутентификации.Ожидаемый результат состоит в том, что все URL-адреса с https://www.seekingalpha.com/symbol/A/earnings/transcripts сканируются.Поэтому необходимо получить доступ к https://www.seekingalpha.com/symbol/A/earnings/more_transcripts?page=page с помощью page = 1,2,3..
, пока все доступные URL не будут проанализированы.