Очистите бесконечные прокрутки сайтов с помощью Scrapy - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу сканировать записи звонков с веб-сайта 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 не будут проанализированы.

1 Ответ

0 голосов
/ 03 февраля 2019

Добавление приведенного ниже после цикла через transcript_urls, похоже, работает.Выдает новый запрос с обратным вызовом parse_link_page, если на текущей странице были найдены transcript_urls.

        if transcript_urls:
            next_page = page + 1
            parsed_url = urlparse(response.url)
            new_query = urlencode({"page": next_page})
            next_url = urlunparse(parsed_url._replace(query=new_query))
            yield scrapy.Request(
                url=next_url,
                callback=self.parse_link_page,
                meta={"ccode": ccode, "page": next_page},
            )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...