使用Scrapy在搜索查询中发出POST请求

时间:2016-03-23 07:13:28

标签: python scrapy web-crawler scrapy-spider

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

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

从我抓取的特定网址的源代码: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

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

谢谢, 丹新手Python作家

2 个答案:

答案 0 :(得分:3)

你走了:))

# -*- 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完成的。 使用Chrome Dev Tools或Firebug for Firefox,^ ^ Trapping ^^ AJAX调用非常简单。 您所要做的就是观察Chrome开发工具或Firebug中的XHR个请求。 XHR是一个AJAX请求。

以下是屏幕截图:

Capturing an XHR Request

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

这是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。 那里还有一个页码,你可以理想地增加页码,直到你捕获所有数据。

答案 1 :(得分:0)

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

使用Splash并参考document进行使用。