Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Python)通过Scrapy与Ajax网页交互_Python_Ajax_Scrapy - Fatal编程技术网

(Python)通过Scrapy与Ajax网页交互

(Python)通过Scrapy与Ajax网页交互,python,ajax,scrapy,Python,Ajax,Scrapy,系统:Windows 10、Python 2.7.15、Scrapy 1.5.1 目标:从html标记中检索目标网站上每个链接项的文本,包括通过“+查看更多存档”按钮显示的链接项(每次6个) 目标网站: 初始进度:Python和Scrapy已成功安装。下面的代码 import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" custom_settings = { # specifies expo

系统:Windows 10、Python 2.7.15、Scrapy 1.5.1

目标:从html标记中检索目标网站上每个链接项的文本,包括通过“+查看更多存档”按钮显示的链接项(每次6个)

目标网站:

初始进度:Python和Scrapy已成功安装。下面的代码

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    custom_settings = {
        # specifies exported fields and order
        'FEED_EXPORT_FIELDS': ["href", "eventtype", "eventmonth", "eventdate", "eventyear"],
    }

def start_requests(self):
    urls = [
        'https://magic.wizards.com/en/content/deck-lists-magic-online-products-game-info',
    ]

    for url in urls:
        yield Request(url=url, callback=self.parse)

def parse(self, response):
    for event in response.css('div.article-item-extended'):
        yield {
            'href': event.css('a::attr(href)').extract(),
            'eventtype': event.css('h3::text').extract(),
            'eventmonth': event.css('span.month::text').extract(),
            'eventdate': event.css('span.day::text').extract(),
            'eventyear': event.css('span.year::text').extract(),
        }
…成功生成以下结果(当-o到.csv时)

然而,爬行器不会触及Ajax按钮隐藏的任何信息。我在谷歌上搜索和消化了大量文档、示例文章和“帮助我”帖子。我的印象是,为了让爬行器真正看到ajax隐藏的信息,我需要模拟某种请求。不同的是,正确的请求类型可能与XHR、scrapy FormRequest或其他有关。一般来说,我对web架构太陌生,无法猜测答案

我拼凑了一个调用FormRequest的初始代码版本,它似乎仍然能够很好地到达初始页面,但是增加唯一出现变化的参数(当检查物理单击页面上的按钮时发出的xhr调用时)似乎没有效果。代码在这里

import scrapy

class QuotesSpider(scrapy.Spider):
name = "quotes"
custom_settings = {
    # specifies exported fields and order
    'FEED_EXPORT_FIELDS': ["href", "eventtype", "eventmonth", "eventdate", "eventyear"],
}

def start_requests(self):
    for i in range(1,10):
        yield scrapy.FormRequest(url='https://magic.wizards.com/en/content/deck-lists-magic-online-products-game-info', formdata={'l':'en','f':'9041','search-result-theme':'','limit':'6','fromDate':'','toDate':'','event_format':'0','sort':'DESC','word':'','offset':str(i*6)}, callback=self.parse)

def parse(self, response):
    for event in response.css('div.article-item-extended'):
        yield {
            'href': event.css('a::attr(href)').extract(),
            'eventtype': event.css('h3::text').extract(),
            'eventmonth': event.css('span.month::text').extract(),
            'eventdate': event.css('span.day::text').extract(),
            'eventyear': event.css('span.year::text').extract(),
        }
…结果与之前相同,只是6条输出线作为一个块重复了9次

有人能帮我指出我缺少什么吗?先谢谢你


附言:每当我为编码问题寻求帮助时,我似乎总是被从椅子上质问起来。如果我做错了什么,请原谅我,我会尽我所能纠正它。

Scrapy不能很好地呈现动态内容,您需要其他东西来处理Javascript。试试这些:


这篇关于scrapy+splash的文章很好地介绍了这个主题。

感谢您的回复!冒着问一个非常无知的问题的风险:仅使用Chrome inspect页面窗口上的信息,我如何知道这是一个javascript问题?通常,当内容以动态方式显示时,您会知道这是javascript问题。也就是说,您可以问“但是我如何知道某些内容是动态生成/显示的?”对于该页面,当您单击该按钮上的inspect并单击它时,您将看到其他html元素从“无处”显示出来;它们没有与该页面一起呈现,但现在单击了按钮,它们就呈现出来了。
import scrapy

class QuotesSpider(scrapy.Spider):
name = "quotes"
custom_settings = {
    # specifies exported fields and order
    'FEED_EXPORT_FIELDS': ["href", "eventtype", "eventmonth", "eventdate", "eventyear"],
}

def start_requests(self):
    for i in range(1,10):
        yield scrapy.FormRequest(url='https://magic.wizards.com/en/content/deck-lists-magic-online-products-game-info', formdata={'l':'en','f':'9041','search-result-theme':'','limit':'6','fromDate':'','toDate':'','event_format':'0','sort':'DESC','word':'','offset':str(i*6)}, callback=self.parse)

def parse(self, response):
    for event in response.css('div.article-item-extended'):
        yield {
            'href': event.css('a::attr(href)').extract(),
            'eventtype': event.css('h3::text').extract(),
            'eventmonth': event.css('span.month::text').extract(),
            'eventdate': event.css('span.day::text').extract(),
            'eventyear': event.css('span.year::text').extract(),
        }