你好,这是我的第一篇文章,
所以我正在尝试制作一个网络蜘蛛,它将按照 invia.cz 中的链接并从酒店复制所有标题。
import scrapy
y=0
class invia(scrapy.Spider):
name = 'Kreta'
start_urls = ['https://dovolena.invia.cz/?d_start_from=13.01.2017&sort=nl_sell&page=1']
def parse(self, response):
for x in range (1, 9):
yield {
'titles':response.css("#main > div > div > div > div.col.col-content > div.product-list > div > ul > li:nth-child(%d)>div.head>h2>a>span.name::text"%(x)).extract() ,
}
if (response.css('#main > div > div > div > div.col.col-content >
div.product-list > div > p >
a.next').extract_first()):
y=y+1
go = ["https://dovolena.invia.cz/d_start_from=13.01.2017&sort=nl_sell&page=%d" % y]
print go
yield scrapy.Request(
response.urljoin(go),
callback=self.parse
)
在这个网站中,页面使用 AJAX 加载,所以我手动更改 URL 的值,仅当页面中出现下一个按钮时才递增 1。
当我测试按钮是否出现并且条件一切良好时,在刮擦的外壳中,但是当我启动蜘蛛时,它只会爬行第一页。
这是我的第一只蜘蛛,所以提前感谢。
还有 errol
您对"全局"y
变量的使用不仅很奇怪,而且也不起作用
你正在使用y
来计算调用 parse 的次数。理想情况下,您不想访问函数范围之外的任何内容,因此您可以使用 request.meta
属性来实现相同的目的:
def parse(self, response):
y = response.meta.get('index', 1) # default is page 1
y += 1
# ...
#next page
url = 'http://example.com/?p={}'.format(y)
yield Request(url, self.parse, meta={'index':y})
关于您的分页问题,您的下一页 url css 选择器不正确,因为您选择的<a>
节点没有附加绝对的 href,这个问题也使您的y
问题过时。要解决此问题,请尝试:
def parse(self, response):
next_page = response.css("a.next::attr(data-page)").extract_first()
# replace "page=1" part of the url with next number
url = re.sub('page=d+', 'page=' + next_page, response.url)
yield Request(url, self.parse, meta={'index':y})
编辑:这是整个工作蜘蛛:
import scrapy
import re
class InviaSpider(scrapy.Spider):
name = 'invia'
start_urls = ['https://dovolena.invia.cz/?d_start_from=13.01.2017&sort=nl_sell&page=1']
def parse(self, response):
names = response.css('span.name::text').extract()
for name in names:
yield {'name': name}
# next page
next_page = response.css("a.next::attr(data-page)").extract_first()
url = re.sub('page=d+', 'page=' + next_page, response.url)
yield scrapy.Request(url, self.parse)