Python 在scrapy中有类似spliter的东西吗?

Python 在scrapy中有类似spliter的东西吗?,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我在刮,我想刮所有的页面,我对刮有一个基本的想法,下面是我使用的代码: import scrapy import json class PatelcospiderSpider(scrapy.Spider): name = 'patelcospider' start_urls = ['https://www.patelco.org/search-results''#stq=&stp=1'] def parse(self, response): co

我在刮,我想刮所有的页面,我对刮有一个基本的想法,下面是我使用的代码:

import scrapy
import json

class PatelcospiderSpider(scrapy.Spider):
    name = 'patelcospider'
    start_urls = ['https://www.patelco.org/search-results''#stq=&stp=1']
    def parse(self, response):
        columns = {
            "question": [],
            "answer": []
        }
        QUESTION_ANSWER_SELECTOR = ".st-ui-result"
        QUESTION_SELECTOR = ".st-ui-type-heading ::text"
        ANSWER_SELECTOR = ".st-ui-type-detail ::text"
        questions_answers = response.css(QUESTION_ANSWER_SELECTOR)
        for question_answer in questions_answers:
            question = question_answer.css(QUESTION_SELECTOR).getall()
            question = " ".join(question).strip()
            answer = question_answer.css(ANSWER_SELECTOR).getall()
            answer = " ".join(answer).strip()
            columns["question"].append(question)
            columns["answer"].append(answer)
            columns["link"].append(response.url)
        return columns
执行时不返回任何值。以下是相关的输出:

2020-08-28 20:39:48[刮屑.堆芯.发动机]信息:蜘蛛网已打开

2020-08-28 20:39:48[scrapy.extensions.logstats]信息:已爬网0页 (以0页/分钟的速度),刮取0个项目(以0个项目/分钟的速度)

2020-08-28 20:39:48[scrapy.extensions.telnet]信息:telnet控制台 收听127.0.0.1:6023


2020-08-28 20:39:55[scrapy.core.engine]调试:爬网(200)这是因为页面是由javascript加载的。您可以在chrome开发工具中自己检查这一点

检查页面-->面板右侧的三个点-->更多工具-->设置-->调试器-->禁用javascript

有两种方法可以用来删除动态内容。动态内容是指javascript使用HTTP请求获取数据并在网页上显示。许多现代网站以这种方式显示信息。这在刮削时是一个挑战

  • 重新设计HTTP请求
  • 使用浏览器自动化
  • 第一个始终是首选,看看网站是否有可以使用的API端点。它快速、高效且可扩展。与浏览器自动化不同,这是最后的手段,或者如果功能过于复杂且没有可用的API。它是缓慢的,脆弱的变化,在网站的HTML和不太可扩展性

    幸运的是,这里有一个API端点。我怎么知道?再次使用chrome开发工具

    检查页面-->网络工具-->XHR

    XHR代表XMLHTTP请求,任何涉及服务器的API都会执行的操作,这些请求都包含在开发工具的这一部分中

    您可以看到“search.json”

    我们可以将此请求复制到将cURL命令转换为python的网站(cURL.trillworks.com)

    这是网站转换的代码。它提供了一种将请求转换为python字典等的有用方法

    import requests
    
    
    data = {
      'q': '',
      'page': '1'
    }
    
    response = requests.post('https://search-api.swiftype.com/api/v1/public/installs/Ty14DuZryzPDG_wzbyzh/search.json', data=data)
    response.json()
    
    现在,如果你复制了请求,你也会得到标题,这是值得玩弄的请求。有些请求只需要一个简单的HTTP get请求,没有任何头、数据、参数和cookie。其他人将需要更多。这里我们需要做的就是在数据参数中指定页码

    输出 这里有很多信息,但是我们可以用它来做一个简单的请求

    Scrapy的代码示例 请注意,
    meta
    参数是一种确保请求也包含我们希望随HTTP请求发送的数据的方法。没有它,您将无法获得所需的正确JSON对象

    这里
    response.json()
    将json对象转换为python字典。在使用scrapy编码之前,我倾向于使用requests包来考虑我想要显示的数据,因为在显示的字典中有嵌套

    举个例子

    response.json()['records']['page'][0]['title']
    
    对应于输出

    'Serving San Francisco Bay Area, Santa Rosa & Sacramento - Patelco Credit Union'
    
    当您将JSON对象转换为字典时,通常会有很多嵌套,这就是为什么我首先使用requests包来解决它。页面嵌套在
    response.json()['records']['page']

    然后,您需要考虑使用字典,或者最好使用条目来存储所需的数据。如果你不确定的话,请查阅相关的文档


    您还可以更改数据参数,以请求更多页面以获取更多数据,但我会先考虑如何自己执行此操作。如果你有困难,我很乐意帮助你。

    非常感谢你,它从字面上解释了我的想法。我确实在网络选项卡中找到了search.json,但无法将其拉出来。我对API有一个模糊的概念,在过去的一个月里我真的很挣扎。关于提取更多的页面,我在第号页面上循环了一圈,它开始工作了。再次感谢你。
    response.json()['records']['page'][0]['title']
    
    'Serving San Francisco Bay Area, Santa Rosa & Sacramento - Patelco Credit Union'