【问题标题】:Can't get through a form with scrapy无法通过scrapy的表单
【发布时间】:2012-06-26 18:13:02
【问题描述】:

我是使用scrapy 的新手,我正在尝试从房地产网站获取一些信息。 该站点有一个带有搜索表单的主页(方法 GET)。 我正在尝试转到我的 start_requests (recherche.php) 中的结果页面,并在 formdata 参数中设置我在地址栏中看到的所有获取参数。 我还设置了我拥有的 cookie,但他也没有工作..

这是我的蜘蛛:

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()

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

2012-06-26 20:04:54+0200 [elyse_avenue] INFO: Spider opened
2012-06-26 20:04:54+0200 [elyse_avenue] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2012-06-26 20:04:54+0200 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2012-06-26 20:04:54+0200 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2012-06-26 20:04:54+0200 [elyse_avenue] DEBUG: Crawled (200) <POST http://www.elyseavenue.com/recherche.php> (referer: None)
2012-06-26 20:04:54+0200 [elyse_avenue] INFO: Closing spider (finished)
2012-06-26 20:04:54+0200 [elyse_avenue] INFO: Dumping spider stats:
    {'downloader/request_bytes': 808,
     'downloader/request_count': 1,
     'downloader/request_method_count/POST': 1,
     'downloader/response_bytes': 7590,
     'downloader/response_count': 1,
     'downloader/response_status_count/200': 1,
     'finish_reason': 'finished',
     'finish_time': datetime.datetime(2012, 6, 26, 18, 4, 54, 924624),
     'scheduler/memory_enqueued': 1,
     'start_time': datetime.datetime(2012, 6, 26, 18, 4, 54, 559230)}
2012-06-26 20:04:54+0200 [elyse_avenue] INFO: Spider closed (finished)
2012-06-26 20:04:54+0200 [scrapy] INFO: Dumping global stats:
    {'memusage/max': 27410432, 'memusage/startup': 27410432}

感谢您的帮助!

【问题讨论】:

    标签: python forms web-crawler scrapy


    【解决方案1】:

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

    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
    

    【讨论】:

    • 这比我的轻率方法要好得多!
    • 如果你有规则怎么办?您拥有的 parse 方法将覆盖 BaseSpider 的 parse 方法。
    • @SammyLee,我没有使用过 CrawlSpider,但想法是在获取主页响应的 parse 方法中使用此方法。我不知道 CrawlSpider 告诉我该怎么做。
    【解决方案2】:

    在您的日志输出中,它说蜘蛛向http://www.elyseavenue.com/recherche.php 发出了 POST 请求,但您说表单使用 GET。

    如果你向URL发出POST请求并搜索“请指定你的搜索”就可以了:

    ➜ 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>
    

    FormRequestRequest 的子类,允许您指定请求类型。您应该指定GET,例如:

    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"
                           )
    

    【讨论】:

    • 我试图像你说的那样强制 method="GET" ,但它没有改变任何东西。我仍然收到一个 POST 请求,但我不知道为什么..
    猜你喜欢
    • 2018-02-09
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多