URL生成的Python Scrapy问题

时间:2017-08-09 14:06:24

标签: python python-3.x web-scraping scrapy

我有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

我不知道如何搜索我从前一个创建的其他网址,以防我找不到任何内容(而不是仅仅“通过”)。

我希望我的问题足够明确。 谢谢你的帮助 !

1 个答案:

答案 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词典中的每个请求一起传递。