Python Can';I don’我不能用scrapy完成表格

Python Can';I don’我不能用scrapy完成表格,python,forms,web-crawler,scrapy,Python,Forms,Web Crawler,Scrapy,我对使用scrapy是个新手,我想从一个房地产网站上获取一些信息。 该站点有一个带有搜索表单(方法GET)的主页。 我正在尝试转到start_请求(recherche.php)中的结果页面,并在formdata参数的地址栏中设置所有get参数。 我也准备好了我的饼干,但他也不工作 这是我的蜘蛛: from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from scrapy.http i

我对使用scrapy是个新手,我想从一个房地产网站上获取一些信息。 该站点有一个带有搜索表单(方法GET)的主页。 我正在尝试转到start_请求(recherche.php)中的结果页面,并在formdata参数的地址栏中设置所有get参数。 我也准备好了我的饼干,但他也不工作

这是我的蜘蛛:

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

from robots_immo.items import AnnonceItem

class ElyseAvenueSpider(BaseSpider):
    name = "elyse_avenue"
    allowed_domains = ["http://www.elyseavenue.com/"]

    def start_requests(self):
        return [FormRequest(url="http://www.elyseavenue.com/recherche.php",
                            formdata={'recherche':'recherche',
                                      'compteurLigne':'2',
                                      'numLigneCourante':'0',
                                      'inseeVille_0':'',
                                      'num_rubrique':'',
                                      'rechercheOK':'recherche',
                                      'recherche_budget_max':'',
                                      'recherche_budget_min':'',
                                      'recherche_surface_max':'',
                                      'recherche_surface_min':'',
                                      'recherche_distance_km_0':'20',
                                      'recherche_reference_bien':'',
                                      'recherche_type_logement':'9',
                                      'recherche_ville_0':''
                                     },
                            cookies={'PHPSESSID':'4e1d729f68d3163bb110ad3e4cb8ffc3',
                                     '__utma':'150766562.159027263.1340725224.1340725224.1340727680.2',
                                     '__utmc':'150766562',
                                     '__utmz':'150766562.1340725224.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)',
                                     '__utmb':'150766562.14.10.1340727680'
                                    },
                            callback=self.parseAnnonces
                           )]



    def parseAnnonces(self, response):
        hxs = HtmlXPathSelector(response)
        annonces = hxs.select('//div[@id="contenuCentre"]/div[@class="blocVignetteBien"]')
        items = []
        for annonce in annonces:
            item = AnnonceItem()
            item['nom'] = annonce.select('span[contains(@class,"nomBienImmo")]/a/text()').extract()
            item['superficie'] = annonce.select('table//tr[2]/td[2]/span/text()').extract()
            item['prix'] = annonce.select('span[@class="prixVignette"]/span[1]/text()').extract()
            items.append(item)
        return items


SPIDER = ElyseAvenueSpider()
当我运行spider时,没有问题,但是加载的页面不是好页面(它说“请指定您的搜索”,我没有得到任何结果..)

2012-06-26 20:04:54+0200[爱丽舍大道]信息:蜘蛛开放
2012-06-26 20:04:54+0200[爱丽舍大道]信息:爬网0页(以0页/分钟的速度),抓取0项(以0项/分钟的速度)
2012-06-26 20:04:54+0200[scrapy]调试:Telnet控制台正在0.0.0.0上侦听
2012-06-26 20:04:54+0200[scrapy]调试:在0.0.0.0:6080上侦听Web服务
2012-06-26 20:04:54+0200[爱丽舍大道]调试:爬网(200)(参考:无)
2012-06-26 20:04:54+0200[爱丽舍大道]信息:关闭蜘蛛(完成)
2012-06-26 20:04:54+0200[爱丽舍大道]信息:倾倒蜘蛛统计数据:
{'downloader/request_bytes':808,
“下载程序/请求计数”:1,
“下载程序/请求方法\计数/发布”:1,
“下载程序/响应字节”:7590,
“下载程序/响应计数”:1,
“下载程序/响应状态\计数/200”:1,
“完成原因”:“完成”,
“完成时间”:datetime.datetime(2012,6,26,18,4,54924624),
“调度程序/内存已排队”:1,
“开始时间”:datetime.datetime(2012,6,26,18,4,54559230)}
2012-06-26 20:04:54+0200[爱丽舍大道]信息:蜘蛛关闭(完成)
2012-06-26 20:04:54+0200[scrapy]信息:倾销全球统计数据:
{'memusage/max':27410432,'memusage/startup':27410432}

谢谢你的帮助

在您的日志输出中,它表示爬行器向
http://www.elyseavenue.com/recherche.php
,但您说过表单使用GET

如果您向URL发出POST请求并搜索“请指定您的搜索”,请确认:

我会使用它为您完成所有工作,因为您仍然可能会错过一些字段:

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

from robots_immo.items import AnnonceItem

class ElyseAvenueSpider(BaseSpider):

    name = "elyse_avenue"
    allowed_domains = ["elyseavenue.com"] # i fixed this
    start_urls = ["http://www.elyseavenue.com/"] # i added this

    def parse(self, response):
        yield FormRequest.from_response(response, formname='moteurRecherche', formdata={'recherche_distance_km_0':'20', 'recherche_type_logement':'9'}, callback=self.parseAnnonces)

    def parseAnnonces(self, response):
        hxs = HtmlXPathSelector(response)
        annonces = hxs.select('//div[@id="contenuCentre"]/div[@class="blocVignetteBien"]')
        items = []
        for annonce in annonces:
            item = AnnonceItem()
            item['nom'] = annonce.select('span[contains(@class,"nomBienImmo")]/a/text()').extract()
            item['superficie'] = annonce.select('table//tr[2]/td[2]/span/text()').extract()
            item['prix'] = annonce.select('span[@class="prixVignette"]/span[1]/text()').extract()
            items.append(item)
        return items

我试着像你说的那样强制method=“GET”,但它没有改变任何事情。我仍然收到一个POST请求,我不知道为什么。这是一个比我草率的方法更好的答案!如果你有规则呢?您使用的解析方法将覆盖BaseSpider的解析方法。@Sammyley,我还没有使用CrawlSpider,但我们的想法是在获取主页响应的解析方法中使用此方法。我不知道该怎么做。
➜ curl -d "" http://www.elyseavenue.com/recherche.php | grep "Merci de préciser votre recherche."
% Total    % Received % Xferd  Average Speed   Time    Time     Time   Dload  Upload   Total   Spent    Left  Speed
100 37494    0 37494    0     0  54582      0 --:--:-- --:--:-- --:--:-- 60866
    <span class="Nbannonces">Merci de préciser votre recherche.</span>
FormRequest(url="http://www.elyseavenue.com/recherche.php",
                        formdata={'recherche':'recherche',
                                  'compteurLigne':'2',
                                  'numLigneCourante':'0',
                                  'inseeVille_0':'',
                                  'num_rubrique':'',
                                  'rechercheOK':'recherche',
                                  'recherche_budget_max':'',
                                  'recherche_budget_min':'',
                                  'recherche_surface_max':'',
                                  'recherche_surface_min':'',
                                  'recherche_distance_km_0':'20',
                                  'recherche_reference_bien':'',
                                  'recherche_type_logement':'9',
                                  'recherche_ville_0':''
                                 },
                        cookies={'PHPSESSID':'4e1d729f68d3163bb110ad3e4cb8ffc3',
                                 '__utma':'150766562.159027263.1340725224.1340725224.1340727680.2',
                                 '__utmc':'150766562',
                                 '__utmz':'150766562.1340725224.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)',
                                 '__utmb':'150766562.14.10.1340727680'
                                },
                        callback=self.parseAnnonces,
                        method="GET"
                       )
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.http import FormRequest, Request

from robots_immo.items import AnnonceItem

class ElyseAvenueSpider(BaseSpider):

    name = "elyse_avenue"
    allowed_domains = ["elyseavenue.com"] # i fixed this
    start_urls = ["http://www.elyseavenue.com/"] # i added this

    def parse(self, response):
        yield FormRequest.from_response(response, formname='moteurRecherche', formdata={'recherche_distance_km_0':'20', 'recherche_type_logement':'9'}, callback=self.parseAnnonces)

    def parseAnnonces(self, response):
        hxs = HtmlXPathSelector(response)
        annonces = hxs.select('//div[@id="contenuCentre"]/div[@class="blocVignetteBien"]')
        items = []
        for annonce in annonces:
            item = AnnonceItem()
            item['nom'] = annonce.select('span[contains(@class,"nomBienImmo")]/a/text()').extract()
            item['superficie'] = annonce.select('table//tr[2]/td[2]/span/text()').extract()
            item['prix'] = annonce.select('span[@class="prixVignette"]/span[1]/text()').extract()
            items.append(item)
        return items