2

我是 Scrapy 的新手,通过一些教程,我能够抓取一些简单的网站,但我现在面临一个新网站的问题,我必须填写搜索表单并提取结果。我得到的响应没有结果。

例如,对于以下站点:http ://www.beaurepaires.com.au/store-locator/

我想提供一个邮政编码列表并在每个邮政编码中提取有关商店的信息(商店名称和地址)。

我正在使用以下代码,但它不工作,我不知道从哪里开始。

class BeaurepairesSpider(BaseSpider):
    name = "beaurepaires"
    allowed_domains = ["http://www.beaurepaires.com.au"]
    start_urls = ["http://www.beaurepaires.com.au/store-locator/"]
    #start_urls = ["http://www.beaurepaires.com.au/"]

    def parse(self, response):
        yield FormRequest.from_response(response, formname='frm_dealer_locator', formdata={'dealer_postcode_textfield':'2115'}, callback=self.parseBeaurepaires)

    def parseBeaurepaires(self, response):
        hxs = HtmlXPathSelector(response)
        filename = "postcodetest3.txt"
        open(filename, 'wb').write(response.body)
        table = hxs.select("//div[@id='jl_results']/table/tbody")
        headers = table.select("tr[position()<=1]")
        data_rows = table.select("tr[position()>1]")

谢谢!!

4

1 回答 1

3

这里的页面加载大量使用 javascript,对于 Scrapy 来说太复杂了。这是我想出的一个例子:

import re
from scrapy.http import FormRequest, Request
from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider


class BeaurepairesSpider(BaseSpider):
    name = "beaurepaires"
    allowed_domains = ["beaurepaires.com.au", "gdt.rightthere.com.au"]
    start_urls = ["http://www.beaurepaires.com.au/store-locator/"]

    def parse(self, response):
        yield FormRequest.from_response(response, formname='frm_dealer_locator',
                                        formdata={'dealer_postcode_textfield':'2115'},
                                        callback=self.parseBeaurepaires)

    def parseBeaurepaires(self, response):
        hxs = HtmlXPathSelector(response)

        script = str(hxs.select("//div[@id='jl_container']/script[4]/text()").extract()[0])
        url, script_name = re.findall(r'LoadScripts\("([a-zA-Z:/\.]+)", "(\w+)"', script)[0]
        url = "%s/locator/js/data/%s.js" % (url, script_name)
        yield Request(url=url, callback=self.parse_js)

    def parse_js(self, response):
        print response.body  # here are your locations - right, inside the js file

看到使用了正则表达式,硬编码的url,你必须解析js才能得到你的位置——即使你完成它并得到位置也太脆弱了。

只需切换到浏览器内的工具,如selenium(或将 scrapy 与它结合使用)。

于 2013-07-25T08:43:51.787 回答