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