【问题标题】:POST request in search query with Scrapy使用 Scrapy 在搜索查询中发布 POST 请求
【发布时间】:2016-07-10 08:55:30
【问题描述】:

我正在尝试使用 Scrapy 蜘蛛来抓取网站,使用 FormRequest 将关键字发送到特定城市页面上的搜索查询。我读到的内容似乎很简单,但我遇到了麻烦。对 Python 来说相当新,如果有明显的我忽略了,很抱歉。

以下是我试图用来帮助我的主要 3 个网站: 鼠标与 Python [1]; Stack Overflow; Scrapy.org [3]

来自我正在爬取的具体url的源码:www.lkqpickyourpart.com\locations/LKQ_Self_Service_-_Gainesville-224/recents

从我找到的特定页面的来源: <input name="dnn$ctl01$txtSearch" type="text" maxlength="255" size="20" id="dnn_ctl01_txtSearch" class="NormalTextBox" autocomplete="off" placeholder="Search..." /> 我认为搜索的名称是“dnn_ct101_txtSearch”,我将在我发现引用为2 的示例中使用它,并且我想在车辆搜索中输入“toyota”作为我的关键字。

这是我现在的蜘蛛代码,我知道我在开始时导入了过多的东西:

import scrapy
from scrapy.http import FormRequest
from scrapy.item import Item, Field
from scrapy.http import FormRequest
from scrapy.spider import BaseSpider

class LkqSpider(scrapy.Spider):
name = "lkq" 
allowed_domains = ["lkqpickyourpart.com\locations/LKQ_Self_Service_-_Gainesville-224/recents"]
start_urls = ['http://www.lkqpickyourpart.com\locations/LKQ_Self_Service_-_Gainesville-224/recents/']

def start_requests(self):
    return [ FormRequest("www.lkqpickyourpart.com\locations/LKQ_Self_Service_-_Gainesville-224/recents",
                 formdata={'dnn$ctl01$txtSearch':'toyota'},
                 callback=self.parse) ]

def parsel(self):
    print self.status

为什么它不搜索或打印任何类型的结果,我复制的示例是否仅用于登录不进入搜索栏的网站?

谢谢, Dan 新手 Python 作家

【问题讨论】:

    标签: python scrapy web-crawler scrapy-spider


    【解决方案1】:

    给你:)

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    import scrapy
    from scrapy.shell import inspect_response
    from scrapy.utils.response import open_in_browser
    
    
    class Cars(scrapy.Item):
        Make = scrapy.Field()
        Model = scrapy.Field()
        Year = scrapy.Field()
        Entered_Yard = scrapy.Field()
        Section = scrapy.Field()
        Color = scrapy.Field()
    
    
    class LkqSpider(scrapy.Spider):
        name = "lkq"
        allowed_domains = ["lkqpickyourpart.com"]
        start_urls = (
            'http://www.lkqpickyourpart.com/DesktopModules/pyp_vehicleInventory/getVehicleInventory.aspx?store=224&page=0&filter=toyota&sp=&cl=&carbuyYardCode=1224&pageSize=1000&language=en-US',
        )
    
        def parse(self, response):
            section_color = response.xpath(
                '//div[@class="pypvi_notes"]/p/text()').extract()
            info = response.xpath('//td["pypvi_make"]/text()').extract()
            for element in range(0, len(info), 4):
                item = Cars()
                item["Make"] = info[element]
                item["Model"] = info[element + 1]
                item["Year"] = info[element + 2]
                item["Entered_Yard"] = info[element + 3]
                item["Section"] = section_color.pop(
                    0).replace("Section:", "").strip()
                item["Color"] = section_color.pop(0).replace("Color:", "").strip()
                yield item
    
            # open_in_browser(response)
            # inspect_response(response, self)
    

    您尝试抓取的页面是由AJAX 调用生成的。

    默认情况下,Scrapy 不会加载任何动态加载的 Javascript 内容,包括 AJAX。几乎所有在您向下滚动页面时动态加载数据的站点都是使用 AJAX 完成的。 ^^Trapping^^ AJAX 调用非常简单,使用 Chrome Dev Tools 或 Firebug for Firefox。 您所要做的就是观察 Chrome 开发工具或 Firebug 中的 XHR 请求。 XHR 是一个 AJAX 请求。

    这是它的外观截图:

    找到链接后,您可以更改其属性。

    这是 Chrome 开发工具中的 XHR 请求给我的链接:

    http://www.lkqpickyourpart.com/DesktopModules/pyp_vehicleInventory/getVehicleInventory.aspx?store=224&page=0&filter=toyota&sp=&cl=&carbuyYardCode=1224&pageSize=1000&language=en-US
    

    我已将页面大小更改为 1000,以便每页提供 1000 个结果。默认值为 15。 那里还有一个页码,理想情况下您会增加该页码,直到您捕获所有数据。

    【讨论】:

    • 谢谢!这真的很有帮助。因此,在开始 url 中,它出现在“field=”之后和“&sp”之前,可能有一个字符变量“keyword”或者可能会根据我想要生成或抓取的结果页面而改变的东西?
    • 谢谢!这真的很有帮助。因此,在开始 url 中,它出现在“field=”之后和“&sp”之前,可能有一个字符变量“keyword”或者可能会根据搜索我想要生成和抓取的页面而改变的东西?如果我希望能够将其与从其他起始网址抓取的搜索结果合并在一起,那么存储汽车列表和随附图像的最佳方式是什么。
    【解决方案2】:

    网页需要javascript渲染框架来加载scrapy代码中的内容

    使用Splash 并参考document 的用法。

    【讨论】:

    猜你喜欢
    • 2014-06-28
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2020-08-16
    • 2011-01-19
    相关资源
    最近更新 更多