我正在抓取一个网站。但是我有一个问题。我做了一个类和一个变量,并给了它一个从中抓取数据的链接。但是在网站中,一页中有很多类别。表示有些国家名称用字母INSTALLDIR
列出。我做了一个循环,仅输入从CustomActionData
开始的国家/地区的第一个字母,这样我就不能一次又一次重复链接。但这是行不通的。它只是给我提供了位于变量A, B upto Z
列表末尾的国家名称。如果列表以C结尾,它将为我提供C开头的国家名称,而不是B和A。我希望您理解。.
A, B upto Z
答案 0 :(得分:1)
我对函数外部变量的逻辑一无所知(或者您对缩进有疑问),但是请检查以下解决方案:
import scrapy
class DmozSpiderSpider(scrapy.Spider):
name = 'Dmoz'
start_urls = ['http://dmoz-odp.org/']
def parse(self, response):
eleventh_category = ['A', 'B', 'C']
for again in eleventh_category:
save = 'http://dmoz-odp.org/Regional/{}/'.format(again)
items = {
'Navbar': response.css('#main-nav a::text').extract(),
'Category_names': response.css('.top-cat a::text').extract(),
'Subcategories': response.css('.sub-cat a::text').extract(),
# this is eleventh_category
'Eleventh_category': save,
}
yield response.follow(save, self.alpha_country, meta={'items': items})
def find_items(self, response, names, finder):
items = response.meta['items']
for name, find in zip(names.values(), finder.values()):
items[name] = response.css(find).extract()
yield items
def alpha_country(self, response):
items = response.meta['items']
names = {'name1': 'Countries'}
finder = {'finder1': '.browse-node::text'}
for name, find in zip(names.values(), finder.values()):
items[name] = [i.strip() for i in response.css(find).extract() if i.strip()]
yield items
您在parse
函数中拥有所有逻辑和调用,这更加容易且易于理解。
答案 1 :(得分:0)
如果列表以C结尾,它将只给我名称 从C开始的国家
每次循环时,您都将覆盖save
中的值,因此最终值将始终是eleventh_category
的最后一个值。
您可以将循环放入parse
方法中:
class DmozSpiderSpider(scrapy.Spider):
name = 'Dmoz'
start_urls = ['http://dmoz-odp.org/']
eleventh_category = ['A','B','C']
def parse(self, response):
for again in self.eleventh_category:
save = f'http://dmoz-odp.org/Regional/{again}/'
items = {
'Navbar': response.css('#main-nav a::text').extract(),
'Category_names': response.css('.top-cat a::text').extract(),
'Subcategories': response.css('.sub-cat a::text').extract(),
# this is eleventh_category
'Eleventh_category': save
}
# save and call request to another page
dct = [(save, self.alpha_country)]
for page, callback in dct:
yield response.follow(page, callback, meta={'items': items})