我的蜘蛛没有水平爬行,我也不知道为什么
parse_item
函数在第一页上运行得很好。我在scrapy shell中检查了next_page
的xpath,它是正确的
你能查一下我的密码吗
我想浏览的网站是this
import scrapy
import datetime
import socket
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy.loader import ItemLoader
from itemloaders.processors import MapCompose
from properties.items import PropertiesItem
class EasySpider(CrawlSpider):
name = 'easy'
allowed_domains = ['www.vivareal.com.br']
start_urls = ['https://www.vivareal.com.br/venda/minas-gerais/belo-horizonte/']
next_page = '//li[@class="pagination__item"][last()]'
rules = (
Rule(LinkExtractor(restrict_xpaths=next_page)),
Rule(LinkExtractor(allow=r'/imovel/',
deny=r'/imoveis-lancamento/'),
callback='parse_item'),
)
def parse_item(self, response):
l = ItemLoader(item=PropertiesItem(), response=response)
l.add_xpath('url', 'a/@href', )
l.add_xpath('tipo', '//h1/text()',
MapCompose(lambda x: x.strip().split()[0]))
l.add_xpath('valor', '//h3[@class="price__price-info js-price-sale"]/text()',
MapCompose(lambda x: x.strip().replace('R$ ', '').replace('.', ''), float))
l.add_xpath('condominio', '//span[@class="price__list-value condominium js-condominium"]/text()',
MapCompose(lambda x: x.strip().replace('R$ ', '').replace('.', ''), float))
l.add_xpath('endereco', '//p[@class="title__address js-address"]/text()',
MapCompose(lambda x: x.split(' - ')[0]))
l.add_xpath('bairro', '//p[@class="title__address js-address"]/text()',
MapCompose(lambda x: x.split(' - ')[1].split(',')[0]))
l.add_xpath('quartos', '//ul[@class="features"]/li[@title="Quartos"]/span/text()',
MapCompose(lambda x: x.strip(), int))
l.add_xpath('banheiros', '//ul[@class="features"]/li[@title="Banheiros"]/span/text()',
MapCompose(lambda x: x.strip(), int))
l.add_xpath('vagas', '//ul[@class="features"]/li[@title="Vagas"]/span/text()',
MapCompose(lambda x: x.strip(), int))
l.add_xpath('area', '//ul[@class="features"]/li[@title="Área"]/span/text()',
MapCompose(lambda x: x.strip(), float))
l.add_value('url', response.url)
# Housekeeping fields
l.add_value('project', self.settings.get('BOT_NAME'))
l.add_value('spider', self.name)
l.add_value('server', socket.gethostname())
l.add_value('date', datetime.datetime.now())
return l.load_item()
更新
在搜索日志时,我发现了关于水平爬网的以下内容:
2021-02-22 17:09:24 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.vivareal.com.br/venda/minas-gerais/belo-horizonte/#pagina=2> (referer: https://www.vivareal.com.br/venda/minas-gerais/belo-horizonte/)
2021-02-22 17:09:24 [scrapy.dupefilters] DEBUG: Filtered duplicate request: <GET https://www.vivareal.com.br/venda/minas-gerais/belo-horizonte/#pagina=2> - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
似乎下一页被复制了,但我不知道如何修复它
此外,我意识到,尽管href
指向#pagina=2
,但实际的url是?pagina=2
有什么提示吗
实际上,你的蜘蛛连第一页都没有爬
问题存在于允许的\u域中。换成
你会开始爬行。在这一更改之后,您将得到许多错误(正如我在这里看到的,由于逻辑错误,代码引发了异常),但是您的代码将按预期运行
编辑(2):
检查日志:
如here和this old question所述,基本上,允许的_域没有正确设置
编辑: 要使其清晰:运行问题中定义的爬行器后,我得到的日志是:
当我使用建议的更改运行时,日志如下(适于不显示我的路径):
相关问题 更多 >
编程相关推荐