Python 用scrapy刮无限滚动的网站

Python 用scrapy刮无限滚动的网站,python,scrapy,Python,Scrapy,我想用scrapy从网站上抓取通话记录 爬行器的行为应如下:1)开始时,提供了公司代码列表ccodes。2) 对于每个公司,所有可用的成绩单URL都从中解析。3) 从每个转录本url解析相关内容 困难在于它包含无限滚动机制。因此,我们的想法是使用javascript调用的page=1,2,3..逐个迭代json文件。json文件包含键html和count。键html应用于解析转录本URL,键count应用于在没有其他URL时停止。其标准是count=0 这是到目前为止我的代码。我已经成功地解析了

我想用scrapy从网站上抓取通话记录

爬行器的行为应如下:1)开始时,提供了公司代码列表
ccodes
。2) 对于每个公司,所有可用的成绩单URL都从中解析。3) 从每个转录本url解析相关内容

困难在于它包含无限滚动机制。因此,我们的想法是使用javascript调用的
page=1,2,3..
逐个迭代json文件。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进行爬网。因此,有必要使用
page=1,2,3..
进行访问,直到解析所有可用的URL

在成绩单URL中循环后添加以下内容似乎有效。如果在当前页面上找到了抄本URL,它将生成一个带有回调的新请求,以解析链接页面

        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},
            )