我有Scrapy的问题。 我想废弃一个N url列表(在同一个网站上),但我不知道哪个URL可以工作。事实上,我想在网站上搜索一些东西,一个道路 - 村庄 - 县。 如果我告诉网站搜索道路+村庄+县,他可能找不到任何东西。如果他没有找到我想要的东西,我会通过搜索村庄+县,最后只搜索县,进行更“全球化”的搜索。 示例:我有位置:
“D 32,Serrières-de-Briord,Belley,Ain,Auvergne-Rhône-Alpes”。这里 我们有[Road = D 32],[Serrières-de-Briord :(精确和小) 公社],[贝利:(最近的和最大的)公社],[艾因:部门], [Auvergne-Rhône-Alpes:地区]。
我想做的是: 搜索
D 32 +Serrières-de-Briord + Belley + Ain + Auvergne-Rhône-Alpes
如果没有结果,请搜索:
塞里耶尔德布里奥尔+ +的Belley AIN +奥弗涅-罗纳 - 阿尔卑斯。
如果没有结果,请搜索
+的Belley AIN +奥弗涅-罗纳 - 阿尔卑斯
(通常,此时没关系)。
问题是我想为25000个地点做这件事。所以我不能给scrapy 25000 * 3 = 75 000 URL废弃。而且问题还在于避免Scrapy在相同信息中多次扫描。 因此,我想做的是: start_url = [最精确级别的所有网址 - 25] 对于start_url中的url: 如果没有我想要的东西:去废料“url1”(它是由url构建的,但更精确)。 如果url1没有我想要的东西:去废料“url2”(从url1构建,此时它应该没问题)。 如果我有一个好的“网址”,请去解析()(并获取我需要的信息)。
这是我的代码:
import scrapy
from scrapy.http import Request
class QuotesSpider(scrapy.Spider):
name = "street"
start_urls = [
'http://prix-immobilier.lemonde.fr/prix-immobilier/recherche?q=rue+des+colonnes+du+trone+Paris+Ile-de-France+75012',
'http://prix-immobilier.lemonde.fr/prix-immobilier/recherche?q=Route+Badevel+à+Saint-Dizier%2C+Badevel%2C+Montbéliard',
]
def start_requests(self):
for urly in self.start_urls:
yield Request(url=urly,callback=self.enjoy)
def enjoy(self,response):
if response.css("#price_container h1::text").extract_first()[:4]=="Prix":
yield Request(url=urly,callback=self.parse)
else:
pass
def parse(self,response):
I parse the info...
这里的“享受”部分是仅选择有趣的网址并“通过”其他网址。但是,这个脚本不起作用。我收到这个错误:
line 27, in enjoy
yield Request(url=urly,callback=self.parse)
NameError: name 'urly' is not defined
我不知道如何搜索我从前一个创建的其他网址,以防我找不到任何内容(而不是仅仅“通过”)。
我希望我的问题足够明确。 谢谢你的帮助 !
答案 0 :(得分:1)
您可以通过meta
传递搜索参数。
例如,在start_requests
中,您可以使用搜索参数列表,而不是从URL列表(self.start_urls
)中产生。
下面是一个玩具蜘蛛使用httpbin.org发出请求,每个3-params,然后是最后2个,然后是最后一个:
from w3lib.url import add_or_replace_parameter
import scrapy
class QuotesSpider(scrapy.Spider):
name = "street"
base_search_url = 'http://httpbin.org/get'
search_params = [
['C', 'B', 'A'],
['F', 'E', 'D'],
]
def _build_search_request(self, params):
url = add_or_replace_parameter(
self.base_search_url,
'q',
' '.join(params)
)
return scrapy.Request(url, meta={'params': params},
callback=self.parse)
def start_requests(self):
for params in self.search_params:
yield self._build_search_request(params)
def parse(self, response):
if 'ok' in response.text:
# parse_info
# ...
pass
else:
params = response.meta['params']
params.pop(0)
if params:
yield self._build_search_request(params)
注意搜索参数如何与meta
词典中的每个请求一起传递。